文章插图
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) 。
MediaCodec状态与生命周期
文章插图
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状态 。错误可能是在队列操作时返回的错误或者异常导致的 。
当调用了mediaCodec.start()方法后,就由stopped到Executing状态了,在此状态下,可以通过上面描述的缓冲队列操作来处理数据
推荐阅读
- 怎么在王者荣耀改名字,王者荣耀网名怎么改不了
- 美图秀秀抠图有什么用,美图秀秀要怎么进行抠图
- 怎么关闭抖音商品橱窗功能,商品橱窗开通后可以关闭几次
- 王者荣耀如何把恋人关系解除,怎么才能解除王者里的恋人关系呢
- 活蟹怎么处理干净,螃蟹买回来怎么处理干净
- 表格公式下拉公式不计算,Excel公式不自动计算怎么办
- 可乐开了可以放多久,可乐开封后放冰箱可以存放多久
- cad中文字如何放大,CAD中文字反向怎么办
- 华为手机玩游戏掉帧很卡怎么办