基本解释
MediaCodec类可以用于使用一些基本的多媒体编解码器,它是Android基本的多媒体支持基础架构的一部分通常和 MediaExtractor MediaSync MediaMuxer MediaCrypto MediaDrm Image Surface AudioTrack 一起使用。
MediaCodec通过 input缓冲器(缓存器实质为Buffer数组)或者Surface向编码器内部输入需要解码或编码的数据,通过MediaCodec的内部处理output读取MediaCodec已经解码或编码好的数据 流程如下
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的为缓冲区数据下标