MediaCodec 可以用来获得安卓底层的多媒体编码,可以用来编码和解码,它是安卓 low-level 多媒体基础框架的重要组成部分。
mediaCodec工作流程
MediaCodec 的作用是处理输入的数据生成输出数据。首先生成一个输入数据缓冲区,将数据填入缓冲区提供给 codec,codec 会采用异步的方式处理这些输入的数据,然后将填满输出缓冲区提供给消费者,消费者消费完后将缓冲区返还给 codec。
接收的数据
MediaCodec 接受三种数据格式:压缩数据,原始音频数据和原始视频数据。
这三种数据都可以使用 ByteBuffer 作为载体传输给 MediaCodec 来处理。但是当使用原始视频数据时,最好采用 Surface 作为输入源来替代 ByteBuffer,这样效率更高,因为 Surface 使用的更底层的视频数据,不会映射或复制到 ByteBuffer 缓冲区。
压缩数据
压缩数据可以作为解码器的输入数据或者编码器的输出数据,需要指定数据格式,这样 codec 才能知道如何处理这些压缩数据。
对于视频数据而言,通常是一帧数据;音频数据,一般是单个处理单元。
原始音频数据
原始音频数据即编码器的输入数据,解码器的输出数据。包含整个 PCM 音频数据帧,这是通道顺序中每个通道的一个样本。每个采样都是以本地字节顺序的 16 位有符号整数。
原始视频数据
原始视频数据也是编码器的输入数据,解码器的输出数据。即yuv数据,MediaCodec主要支持的格式为:
- native raw video format : COLOR_FormatSurface,用来处理 Surface 模式的数据输入输出
- flexible YUV buffers : 例如 COLOR_FormatYUV420Flexible
- specific formats: 支持ByteBuffer模式,有一些厂家会定制