MediaCodec(NDK)与使用C ++的Android手机(Snapdragon 820)上的播放器的OpenMAX

时间:2016-11-01 14:03:10

标签: mediacodec

基于对Android NDK下可用样本的审核,似乎为了使用硬件解码器(OMX.xxx),我们可以使用MediaCodec或OpenMAXAL接口。

我的问题是:

  1. 这是在移动设备上使用硬件解码器的最佳方式吗(Android上的Snapdragon 820)?

  2. 使用OMX优于MediaCodec是否有任何优势。目前的Android标题实际上只支持MPEG2 / .ts mimetype。我希望你能通过OpenMax支持视频流解码(mp4等) - 这是正确的评估吗?

  3. 我的要求是: 1.支持普通容器的流式音频和视频播放。 2.利用移动硬件(GPU + DSP)进行解码。 3.基于每帧执行图像处理。 4.避免为音频和视频编写自己的时间同步。

    我已经使用ffmpeg编写了基本播放器,但我无法使用硬件解码器,所以不要关注它。

    我对上述任何其他框架(免费或商业)持开放态度。

    科坦

1 个答案:

答案 0 :(得分:4)

一般来说,MediaCodec是推荐的。

在MediaCodec在Android 4.1中推出之前,OpenMAX AL API已作为Android 4.0中的权宜措施添加。它实际上已被弃用(即使我不确定是否有任何官方声明说明这一点)。

它们在略有不同的抽象级别上运行,在大多数情况下,MediaCodec的工作量较少。

使用OpenMAX AL,您需要提供数据的MPEG TS流以进行解码和回放。它不支持其他容器格式。它既不能直接访问解码数据,也可以直接播放。但是,它会照顾音频和视频的同步。

OpenMAX AL的优点:

  • 如果您的输入是MPEG TS,则可以避免一个额外的步骤
  • 自动处理同步

缺点:

  • 其他所有

使用MediaCodec,您需要提供单独的数据包进行解码。它根本不支持任何容器格式,但作为调用者你应该照顾它。它确实允许您直接访问已解码的输出数据,但要呈现它,您需要手动处理同步。 (在Android 6.0中,有一个新类MediaSync,虽然可以帮助解决这个问题。)

MediaCodec的优点:

  • 通用,灵活
  • 同样适用于任何容器(不需要重新包装到MPEG TS中)

MediaCodec的缺点:

  • 要求您手动处理同步
  • 相当低的水平,需要你做很多工作

为了提取单个数据包,有MediaExtractor类,它对静态文件的一些常见文件格式很有用。我不认为它可用于流媒体,例如虽然支离破碎的MP4。

因此,如果您想要播放除MPEG TS以外的格式的流式播放,则需要自己处理数据包的提取(或者使用其他库,例如libavformat来完成该任务)。如果您使用OpenMAX AL,则需要将各个数据包打包回MPEG TS(使用例如libavformat)。如果您使用MediaCodec,则需要在播放期间处理音频和视频的同步。

如果您需要处理已解码的帧,MediaCodec可能是唯一的方法。您可以将解码后的图像数据作为原始YUV获取,也可以将其放在可以使用着色器修改的GL表面中。 (尽管如此,后者也可能使用OpenMAX AL。)