MediaCodec基本套路

基本解释

MediaCodec类可以用于使用一些基本的多媒体编解码器,它是Android基本的多媒体支持基础架构的一部分通常和 MediaExtractor MediaSync MediaMuxer MediaCrypto MediaDrm Image Surface AudioTrack 一起使用。

MediaCodec通过 input缓冲器(缓存器实质为Buffer数组)或者Surface向编码器内部输入需要解码或编码的数据,通过MediaCodec的内部处理output读取MediaCodec已经解码或编码好的数据 流程如下

image
MediaCodec基本方法:
  • dequeueInputBuffer:返回要用有效数据填充的输入缓冲区的索引(等待获取缓存区 会阻塞)
  • getInputBuffer:获取需要编码数据的输入ByteBuffer(根据dequeueInputBuffer获取的缓冲下标获取指定ByteBuffer)
  • queueInputBuffer:告诉编码器数据以放入指定的ByteBuffer
  • dequeueOutputBuffer:返回要用有效数据填充的输出缓冲区的索引
  • getOutputBuffer:获取需要编码数据的输出ByteBuffer
  • releaseOutputBuffer:告诉编码器数据处理完成,释放ByteBuffer数据
mediaCodec基本使用实际代码:
  while (is) {
            //放入处理数据
            int inputIndex = mediaCodec.dequeueInputBuffer(-1);
            ByteBuffer inputBuffer = mediaCodec.getInputBuffer(inputIndex);//获取编码器传入数据ByteBuffer
            inputBuffer.clear();//清除以前数据
            inputBuffer.put(PCMbuffer);//PCMbuffer需要编码器处理数据
            mediaCodec.queueInputBuffer(inputIndex, 0, inputBuffer.limit(), 0, 0);//通知编码器 数据放入

            //处理完成数据
            int outindex = mediaCodec.dequeueOutputBuffer(bufferInfo, 1000);//获取解码数据
            while (outindex >= 0) {
                ByteBuffer outputBuffer = mediaCodec.getOutputBuffer(outindex);//获取编码数据
                //outputBuffer 编码器处理完成的数据
                mediaCodec.releaseOutputBuffer(outindex, false);//告诉编码器数据处理完成
                outindex = mediaCodec.dequeueOutputBuffer(bufferInfo, 1000);//可能一次放入的数据处理会输出多个数据 
            }
        }
小细节
dequeueInputBuffer dequeueOutputBuffer 返回值解释
  • INFO_TRY_AGAIN_LATER=-1 等待超时
  • INFO_OUTPUT_FORMAT_CHANGED=-2 媒体格式更改
  • INFO_OUTPUT_BUFFERS_CHANGED=-3 缓冲区已更改(过时)
  • 大于等于0的为缓冲区数据下标

你可能感兴趣的:(MediaCodec基本套路)