MediaFormat
封装描述媒体数据格式的信息,无论是音频还是视频。媒体数据的格式被指定为字符串/值对。
KEY_MIME:格式的类型
KEY_MAX_INPUT_SIZE:可选,输入数据缓冲区的最大大小
KEY_BIT_RATE:仅编码器,所需比特率(以比特/秒为单位)
视频格式具有以下键:
KEY_WIDTH:描述视频格式的内容的宽度的键。
KEY_HEIGHT:描述视频格式的内容的高度的键。
KEY_COLOR_FORMAT:描述视频格式的内容的颜色格式的键。
KEY_FRAME_RATE:描述以帧/秒为单位的视频格式的帧速率的键。
KEY_I_FRAME_INTERVAL: 描述以I帧表示的I帧的频率的键。
音频格式具有以下键:
KEY_CHANNEL_COUNT:描述音频格式的频道数量的键。
KEY_SAMPLE_RATE:描述音频格式的采样率的键。
KEY_IS_ADTS:可选,如果解码 AAC音频内容,将此键设置为1表示每个音频帧都以ADTS头为前缀。
KEY_AAC_PROFILE:仅编码器,可选,如果内容为AAC音频,则指定所需的配置文件。
KEY_CHANNEL_MASK:可选的,音频通道分配的掩码。
KEY_FLAC_COMPRESSION_LEVEL:仅编码器,可选,如果内容为FLAC音频,则指定所需的压缩级别。
MediaCodec.BufferInfo
每个缓冲区元数据包括一个偏移量和一个大小,用于指定关联的编解码器(输出)缓冲区中有效数据的范围。
其中有个字段是flags,它有几种常量情况:
flags = 4;End of Stream。
flags = 2;首帧信息帧。
flags = 1;关键帧。
flags = 0;普通帧。
MediaCrypto
如果视频需要进行视频版权的,那么MediaCodec进行decode的时候,configure()方法需要传进一个MediaCrypto保护。MediaCrypto类可以与MediaCodec
一起使用来解码加密的媒体数据。 加密方案被分配16个字节的UUID,方法isCryptoSchemeSupported(UUID)
可用于查询设备是否支持给定的方案。
MediaCodecInfo
提供MediaCodec在设备上的支持信息。
主要方法:getCapabilitiesForType
结合使用
音视频录制
将采集到的视音频通过MediaCodec进行编码处理,之后将编码数据传递到MediaMuxer进行合成,也就完成了视音频录制的功能。
根据视音频采集的相关参数创建MediaCodec,当MediaCodec的outputBufferId为INFO_OUTPUT_FORMAT_CHANGED时,可以通过codec.getOutputFormat()得到相应的MediaFormat,之后便可以用这个MediaFormat为MediaMuxer添加相应的视音频轨道。通过codec.dequeueOutputBuffer可以得到编码后的数据的bufferInfo信息和相应的数据,之后将这个数据和bufferInfo通过muxer.writeSampleData(currentTrackIndex, nputBuffer, bufferInfo)传递给Muxer,也就将整个视音频数据合成到了mp4中。
音视频播放
利用MediaExtractor分离视音频文件,得到相应的音频轨道和视频轨道。之后通过MediaExtractor从相应的轨道中获取数据,并且将这些数据传递给MediaCodec的输入缓冲区,经过MediaCodec的解码便可以得到相应的原始数据。音频解码后可以得到PCM数据,从而可以传递给AudioTrack进行播放。视频解码后可以渲染到相应的Surface,这个Surface可以是通过SurfaceTexture创建,而SurfaceTexture是可以通过纹理创建的,从而将解码后的视频数据传递到纹理上了。
MediaExtractor解析视音频文件,可以得到相应数据的pts,之后pts可以传输到MediaCodec,之后在MediaCodec的输出里面可以得到相应的pts,之后在根据视音频的pts来控制视音频的渲染,从而实现视音频的同步。
音视音频转码
视音频的转码,其实就是通过MediaExtractor解析相应的文件,之后得到相应的视频轨道和音频轨道,之后将轨道里的数据传输到MediaCodec进行解码,然后将解码后的数据进行相应的处理(例如音频变声、视频裁剪、视频滤镜),之后将处理后的数据传递给MediaCodec进行编码,最后利用MediaMuxer将视频轨道和音频轨道进行合成,从而完成了整个转码过程。