MediaCodec进行H.264、AAC编码后封装成FLV格式

一、初始化FLV封装包FlvPacker

  private void init(){
        mFlvPacker = new FlvPacker();
        mFlvPacker.initVideoParams(WIDTH, HEIGHT, FRAME_RATE);
        mFlvPacker.initAudioParams(44100, AudioFormat.ENCODING_PCM_16BIT,false);
        mFlvPacker.setPacketListener(new Packer.OnPacketListener() {
            @Override
            public void onPacket(final byte[] data, final int packetType) {
                IOUtils.write(mOutStream, data, 0, data.length);
                //Log.e("wangqi","onPacket()");
                pushExecutor.execute(new Runnable() {
                    @Override
                    public void run() {
                        if(onMediaInfoListener != null)
                        {
                            onMediaInfoListener.onFlvData(data,data.length,packetType);
                        }
                    }
                });

               // LogUtils.getInstance().I(TAG, " data.length  "+data.length + " packetType  " + packetType+"  DATA_DIR  "+DATA_DIR);

            }
        });
    }

二、编码器编码出来的H.264数据进行FLV封装

 while (outputBufferIndex >= 0) {
                                    ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
                                    //进行flv封装
                                    mFlvPacker.onVideoData(outputBuffer, info);
                                    mCodec.releaseOutputBuffer(outputBufferIndex, false);
                                    outputBufferIndex = mCodec.dequeueOutputBuffer(info, 0);
                                }

三、编码器编码出来的AAC数据进行FLV封装

 public void startAudio(){
        audioEncodecThread = new Thread() {
            @Override
            public void run() {
                isAudioEncoder = true;
                pts = 0;
                if(audioEncodec!=null){
                    while(isAudioEncoder)
                    {
                        int outputBufferIndex = audioEncodec.dequeueOutputBuffer(audioBufferinfo, 0);
                        if(outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
                        {
                        }
                        else
                        {
                            while(outputBufferIndex >= 0)
                            {
                                ByteBuffer outputBuffer = audioEncodec.getOutputBuffers()[outputBufferIndex];
                                outputBuffer.position(audioBufferinfo.offset);
                                outputBuffer.limit(audioBufferinfo.offset + audioBufferinfo.size);
                                if(pts == 0)
                                {
                                    pts = audioBufferinfo.presentationTimeUs;
                                }
                                audioBufferinfo.presentationTimeUs = audioBufferinfo.presentationTimeUs - pts;

//                                byte[] data = new byte[outputBuffer.remaining()];
//                                outputBuffer.get(data, 0, data.length);
//                                if(onMediaInfoListener != null)
//                                {
//                                    onMediaInfoListener.onAudioInfo(data);
//                                }
                                mFlvPacker.onAudioData(outputBuffer, audioBufferinfo);

                                audioEncodec.releaseOutputBuffer(outputBufferIndex, false);
                                outputBufferIndex = audioEncodec.dequeueOutputBuffer(audioBufferinfo, 0);
                            }
                        }
                    }
                }
            }
        };
        audioEncodecThread.start();
    }

四、开始FLV封装

 mFlvPacker.start();

五、停止FLV封装

  mFlvPacker.stop();

总结:FLV封装的代码如下所示
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值