mediacodec解析mp4


mediacodec解析mp4

文章插图
MediaCodec讲解
MediaCodec是Android提供的用于对音视频进行编解码的类,它通过访问底层的codec来实现编解码的功能 。是Android media基础框架的一部分,通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack一起使用 。
MediaCodec支持的数据类型
编解码器支持的数据类型:压缩的音视频数据,原始音频数据和原始视频数据 。
  • 数据通过ByteBuffers类来表示 。
  • 可以设置Surface来获取/呈现原始的视频数据,Surface使用本地的视频buffer,不需要进行ByteBuffers拷贝 。可以让编解码器的效率更高 。
  • 通常在使用Surface的时候,无法访问原始的视频数据,但是可以使用ImageReader访问解码后的原始视频帧 。在使用ByteBuffer的模式下,可以使用Image类和getInput/OutputImage(int)获取原始视频帧 。
压缩的音视频数据
  • 对于视频类型,这通常是一个压缩视频帧 。
  • 对于音频数据,这通常是单个访问单元(通常包含由格式类型的指定的几毫秒的音频段(通常包含几毫秒的音频),但是该要求略微放松,因为一个buffer可以包含多个编码的音频访问单元 。
  • 在以上两种情况下,buffer都不在任意字节边界上启动或结束,而是在帧/访问单元边界上启动或结束,除非它们被BUFFER_FLAG_PARTIAL_FRAME标记 。
【更多音视频学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
C++程序员必看,抓住音视频开发的大浪潮!冲击年薪60万

原始音频数据
原始音频buffer包含PCM音频数据的整个帧,这是每个通道按通道顺序的一个样本 。每个样本都是一个 AudioFormat#ENCODING_PCM_16BIT 。
原始视频数据
在ByteBuffer模式下,视频buffer根据它们的MediaFormat#KEY_COLOR_FORMAT进行布局 。可以从getCodecInfo(). MediaCodecInfo.getCapabilitiesForType.CodecCapability.colorFormats获取支持的颜色格式 。视频编解码器可以支持三种颜色格式:
  • native raw video format: CodecCapabilities.COLOR_FormatSurface,可以与输入/输出的Surface一起使用 。
  • flexible YUV buffers 例如CodecCapabilities.COLOR_FormatYUV420Flexible,可以使用getInput/OutputImage(int)与输入/输出Surface一起使用,也可以在ByteBuffer模式下使用 。
  • other, specific formats: 通常只支持ByteBuffer模式 。有些颜色格式是厂商特有的,其他定义在CodecCapabilities 。对于等价于flexible格式的颜色格式,可以使用getInput/OutputImage(int) 。
从Build.VERSION_CODES.LOLLIPOP_MR1.开始,所有视频编解码器都支持flexible的YUV 4:2:0 buffer 。
MediaCodec状态与生命周期
mediacodec解析mp4

文章插图
MediaCodec生命周期状态分为三种 Stopped、Executing和Released 其中Stopped包含三种子状态 Uninitialized(为初始化状态)、Configured(已配置状态)、Error(异常状态) Executing也包含三个子状态 Flushed(刷新状态)、Running(运行状态)和EOS(流结束状态)
Stopped状态:
  • Uninitialized:当使用工厂方法创建了一个MediaCodec对象,此时处于Uninitialized状态 。可以在任何状态调用reset()方法使MediaCodec返回到Uninitialized状态
  • Configured:使用configure(…)方法对MediaCodec进行配置转为Configured状态
  • Error:MediaCodec遇到错误时进入Error状态 。错误可能是在队列操作时返回的错误或者异常导致的 。
Executing状态:
当调用了mediaCodec.start()方法后,就由stopped到Executing状态了,在此状态下,可以通过上面描述的缓冲队列操作来处理数据

推荐阅读