博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LiveRTMP Android采集AAC流进行RTMP推送
阅读量:4342 次
发布时间:2019-06-07

本文共 4514 字,大约阅读时间需要 15 分钟。

 

LiveRTMP Android版demo中,通过使用AudioRecord录音,然后将每一帧数据通过MediaCodec编码成LATM格式音频,然后就发送给服务器就OK了。

AudioRecord的使用

public void startRecord() {        try {            init();            mAudioRecord.startRecording();            mMediaCodec.start();            final ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();            mThread = new Thread(new Runnable() {                @Override                public void run() {                    Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);                    int len = 0, bufferIndex = 0;                    try {                        while (!Thread.interrupted() && !stoped) {                            bufferIndex = mMediaCodec.dequeueInputBuffer(50000);                            if (bufferIndex >= 0) {                                inputBuffers[bufferIndex].clear();                                len = mAudioRecord.read(inputBuffers[bufferIndex], BUFFER_SIZE);                                if (len == AudioRecord.ERROR_INVALID_OPERATION || len == AudioRecord.ERROR_BAD_VALUE) {                                    mMediaCodec.queueInputBuffer(bufferIndex, 0, 0, 0, 0);                                } else {                                    mMediaCodec.queueInputBuffer(bufferIndex, 0, len, 0, 0);                                }                            }                        }                    } catch (RuntimeException e) {                        Log.i(TAG, "record" + e.getMessage());                    }                }            }, "AACRecoder");            mThread.start();            startEncode();        } catch (Exception e) {            Log.e(TAG, "Record___Error!!!!!");        }    }

在循环中通过mAudioRecord.read(inputBuffers[bufferIndex], BUFFER_SIZE)不断的读取音频,然后放入编码队列中去。 新开一个线程用来获取队列中的数据:

private void startEncode() {        mBuffers = mMediaCodec.getOutputBuffers();        mBuffer=null;        encodeThread = new Thread(new Runnable() {            @Override            public void run() {                while (!Thread.interrupted() && !stoped) {                    try {                        if (mBuffer == null) {                            mBuffer = ByteBuffer.allocate(10240);                            while (!Thread.currentThread().isInterrupted() && !stoped) {                                mIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 50000);                                if (mIndex >= 0) {                                    if (mBufferInfo.flags == MediaCodec.BUFFER_FLAG_CODEC_CONFIG) {                                        continue;                                    }                                    mBuffer.clear();                                    mBuffer.position(0);                                    mBuffers[mIndex].get(mBuffer.array(), 0, mBufferInfo.size);                                    mBuffers[mIndex].clear();                                    mBuffer.position(mBuffer.position() + mBufferInfo.size);                                    mBuffer.flip();                                    break;                                } else if (mIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {                                    mBuffers = mMediaCodec.getOutputBuffers();                                } else if (mIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {                                    Log.v(TAG, "output format changed...");                                } else if (mIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {                                    Log.v(TAG, "No buffer available...");                                } else {                                    Log.e(TAG, "Message: " + mIndex);                                }                            }                        }                        int size = mBufferInfo.size;                        byte[] buffer = new byte[size];                        mBuffer.get(buffer);                        easyPusher.push(buffer,System.currentTimeMillis(), 0);                        if (mBuffer.position() >= size) { // read complete                            mMediaCodec.releaseOutputBuffer(mIndex, false);                            mBuffer = null;                        }                    } catch (RuntimeException e) {                                                Log.i(TAG, "record" + e.getMessage());                    }                }            }        }, "AACEncoder");        encodeThread.start();    }

LiveRTMP推送RTMP流时不需要添加ADTS头部。

 

转载于:https://www.cnblogs.com/kumukim/p/11006685.html

你可能感兴趣的文章
javascript 中的var : 隐含变量 全局变量 变量提升
查看>>
阿里巴巴Json工具-Fastjson讲解
查看>>
POJ 2376 (区间问题,贪心)
查看>>
SageCRM的学习资料
查看>>
Xtreme8.0 - Kabloom 动态规划
查看>>
Wing IDE 4.1使用笔记一修正一下框框字体显示不了中文
查看>>
【译】x86程序员手册26-7.5任务切换
查看>>
JS中null与undefined的区别
查看>>
有趣的程序
查看>>
牛客练习赛23 F 托米的游戏
查看>>
静态方法与非静态方法区别
查看>>
第四篇 枚举思想
查看>>
KJBitmap与KJHttp的深度用法
查看>>
HDOJ 1166 敌兵布阵 (线段树)
查看>>
[转]拥抱HTML5,《HTML5设计原理》读后随记
查看>>
28继承,委托,重写--[Asp.Net]
查看>>
Cloudera Manager5安装总结遇到问题及解决办法 CDH 5.8 on CentOS 7
查看>>
浅入深出Vue:数据绑定
查看>>
DELIMITER关键词作用 替换结束符号
查看>>
Java-----隐藏手机号中间四位,身份证号码中间几位
查看>>