官网链接:https://developer.android.google.cn/reference/android/media/MediaCodec?hl=en
概述
MediaCodec类提供了低层次封装的多媒体编解码功能,也就是编码和解码组件。MediaCodec是Android低级别支持多媒体的基础组件,通常和MediaExtractor、MediaSync、MediaMuxer、MediaCrypto、MediaDrm、Image、Surface、AudioTrack一起使用。
宽泛的讲,一个编解码进程处理input数据,生成output数据,处理数据中使用一组input、out缓存buffer且为异步处理方式。一个简单的应用模型:请求或者接收一个空的input buffer,buffer中填数据后送到编解码器,编解码器处理input buffer中的数据,使用一个空的output buffer传递产生的数据。最终,请求或者收到一个装了数据的output buffer,消费掉output buffer中的数据或者直接释放output buffer。
数据类型
编解码器可以处理三种数据类型:压缩了的数据、裸audio数据、裸video数据。三种数据类型都可以使用Bytebuffer处理,但是对于裸video数据,使用Surface,可以提高编解码器性能。Surface使用本地video buffer,没有映射或者拷贝数据到ByteBuffers,因此更高效。正常情况下,使用Surface无法获取到裸video数据,但是可以使用ImageReader类获取非有保证的裸视频帧数据,这种方式依然比使用ByteBuffer高效,即使本地buffer映射到DirectByteBuffer。当使用ByteBuffer模式,可以通过Image类的getInput、OutputImage(int)获取裸视频帧数据。
压缩数据buffers
Input buffers(解码器使用)和Output buffers(编码器使用)根据MediaFormat#KEY_MIME缓存压缩数据。对于video类型数据,每次缓存一帧压缩video数据。对于audio类型数据,缓存一个可使用的单元(一个编码audio片段,根据格式类型决定包含几毫秒的audio数据),但是这种需求些微宽松些,可包含多个可使用的audio数据单元。如论什么形式,缓存数据不可能开始或者结束在任意字节边界,而是在帧或者可使用单元边界上,除非使用BUFFER_FLAG_PARTIAL_FRAME标记。
裸Audio buffers
裸audio buffers包含完整的PCM audio帧数据,帧数据是按照通道顺序的一个通道的采样数据。每一个PCM采样数据是一个按照本地字节序存储的16位有符号整形或者一个浮点数。裸Audio buffers是浮点数编码的情况,仅仅是在通过MediaCodec configure(…)设置MediaFormat#KEY_PCM_ENCODING为 AudioFormat#ENCODING_PCM_FLOAT,且在解码情况下通过getOutputFormat()确认,在编码情况下通过getInputFormat()确认。判断一个采样数据是浮点型,可以使用如下方法:
static boolean isPcmFloat(MediaFormat format) {
return format.getInteger(MediaFormat.KEY_PCM_ENCODING, AudioFormat.ENCODING_PCM_16BIT)
== AudioFormat.ENCODING_PCM_FLOAT;
}