MediaCodec 实现硬件解码

MediaCodec

MediaCodec 是 Android 提供的硬件编解码器,通常配合 MediaExtractor(用于解析媒体文件,获取音视频数据), MediaMuxer(用于封装已编码的音视频数据到文件中), Image, Surface, AudioTrack(用于播放 PCM 数据) 等类一起使用。相关辅助类有 MediaFormat, MediaCodec.BufferInfo, MediaCodecInfo, MediaCodecList 等。

它使用了一系列 input buffer 和 output buffer,异步地处理数据。简单来说,你首先要请求(或接收)一个空的 input buffer,然后向里面填充数据并发送给编解码器进行处理,编解码器消耗(解码/编码)数据并把数据迁移到它其中一个 ouput buffer 中。

使用流程(以解码为例,编码基本类似):
1) MediaCodec.createDecoderByType(),创建解码器
2) decoder.configure(),配置解码器
3) decoder.start(),开始运行,MediaCodec 会在这里创建 inputBuffers、outputBuffers 两个 buffer 数组
4) decoder.dequeueInputBuffer(),获取一个 InputBuffer,用于填充未解码的数据
5) decoder.queueIntputBuffer(),填充数据完毕后,把这个 buffer 放进 MediaCodec 里面,让它进行解码操作
6) decoder.dequeueOutputbuffer(),获取一个 OutputBuffer,此时已解码成功,可以使用解码后的数据了
7) decoder.releaseOutputbuffer(),如果不再需要这个 OutputBuffer,就释放它,可以关联一个 Surface,调用这句代码的同时把解码后的数据渲染到 Surface 上面,Surface 使用完毕后会释放该 Buffer

流程图如下:
MediaCodec 运行流程图

MediaCodec 的使用方式有三种:
1) 使用 Buffer 数组同步处理(deprecated),本文使用的是这种方式
2) 使用 Buffers 同步处理
3) 使用 Buffers 异步处理

因为第二、第三种方式要求 API 21 以上,因此这篇文章用的是第一种,其它两种方式有兴趣的可以自己研究:MediaCodec | Android Developers

另外,我在使用 MediaCodec 的时候发现了很多问题,有些是兼容性问题,有些我也不懂是什么问题,感觉很不稳定,因此我用得更多的是 FFmpeg,MediaCodec 没有深入研究,这里仅作为一个代码示例供大家参考。

解码

public class HWCodec {
   

    private static final String TAG = "HWCodec";

    private static final long DEFAULT_TIMEOUT = 10 * 1000;

    private static final int MEDIA_TYPE_VIDEO = 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值