zoukankan      html  css  js  c++  java
  • LiveRTMP Android采集AAC流进行RTMP推送

    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头部。

     

  • 相关阅读:
    数据库SQL实战- 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
    数据库SQL实战- 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
    数据库SQL实战- 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
    springboot 整合redis 以及redis的简单使用
    SQL语句按in排序
    编写高质量的代码
    linux 后渗透测试
    工具包学习与收集
    python 学习实例(cmdMD链接)
    python 学习之FAQ:find 与 find_all 使用
  • 原文地址:https://www.cnblogs.com/kumukim/p/11006685.html
Copyright © 2011-2022 走看看