基于对Android NDK下可用样本的审核,似乎为了使用硬件解码器(OMX.xxx),我们可以使用MediaCodec或OpenMAXAL接口。
我的问题是:
这是在移动设备上使用硬件解码器的最佳方式吗(Android上的Snapdragon 820)?
使用OMX优于MediaCodec是否有任何优势。目前的Android标题实际上只支持MPEG2 / .ts mimetype。我希望你能通过OpenMax支持视频流解码(mp4等) - 这是正确的评估吗?
我的要求是: 1.支持普通容器的流式音频和视频播放。 2.利用移动硬件(GPU + DSP)进行解码。 3.基于每帧执行图像处理。 4.避免为音频和视频编写自己的时间同步。
我已经使用ffmpeg编写了基本播放器,但我无法使用硬件解码器,所以不要关注它。
我对上述任何其他框架(免费或商业)持开放态度。
科坦
答案 0 :(得分:4)
一般来说,MediaCodec是推荐的。
在MediaCodec在Android 4.1中推出之前,OpenMAX AL API已作为Android 4.0中的权宜措施添加。它实际上已被弃用(即使我不确定是否有任何官方声明说明这一点)。
它们在略有不同的抽象级别上运行,在大多数情况下,MediaCodec的工作量较少。
使用OpenMAX AL,您需要提供数据的MPEG TS流以进行解码和回放。它不支持其他容器格式。它既不能直接访问解码数据,也可以直接播放。但是,它会照顾音频和视频的同步。
OpenMAX AL的优点:
缺点:
使用MediaCodec,您需要提供单独的数据包进行解码。它根本不支持任何容器格式,但作为调用者你应该照顾它。它确实允许您直接访问已解码的输出数据,但要呈现它,您需要手动处理同步。 (在Android 6.0中,有一个新类MediaSync,虽然可以帮助解决这个问题。)
MediaCodec的优点:
MediaCodec的缺点:
为了提取单个数据包,有MediaExtractor类,它对静态文件的一些常见文件格式很有用。我不认为它可用于流媒体,例如虽然支离破碎的MP4。
因此,如果您想要播放除MPEG TS以外的格式的流式播放,则需要自己处理数据包的提取(或者使用其他库,例如libavformat来完成该任务)。如果您使用OpenMAX AL,则需要将各个数据包打包回MPEG TS(使用例如libavformat)。如果您使用MediaCodec,则需要在播放期间处理音频和视频的同步。
如果您需要处理已解码的帧,MediaCodec可能是唯一的方法。您可以将解码后的图像数据作为原始YUV获取,也可以将其放在可以使用着色器修改的GL表面中。 (尽管如此,后者也可能使用OpenMAX AL。)