基于对Android下可用样本的审查,看来为了使用硬件解码器(OMX.xxx),我们可以使用MediaCodec或OpenMAXAL接口。
我的问题是:
我的要求是:
我已经用ffmpeg编写了基本的播放器,但我无法使用硬件解码器,所以没有遵循它。
我是开放的任何其他框架(免费或商业),将完成上述。
发布于 2016-11-01 22:00:55
一般来说,推荐的是MediaCodec。
OpenMAX API是在Android4.0中作为权宜之计添加的,后来MediaCodec才在Android4.1中发布。这实际上是不可取的(尽管我不确定是否有官方声明这样说)。
它们在稍微不同的抽象级别上操作,在大多数情况下,MediaCodec的工作较少。
使用OpenMAX AL,您需要提供一个MPEG TS数据流来解码和回放。它不支持其他容器格式。它也不允许您直接访问已解码的数据,但它将直接回放。然而,它确实负责音频和视频的同步。
OpenMAX AL的优点:
缺点:
使用MediaCodec,您需要提供要解码的单个数据包。它本身根本不支持任何容器格式,但是您作为调用者应该负责处理这个问题。它确实允许您直接访问已解码的输出数据,但是要显示它,您需要手动处理同步。(在Android6.0中,有一个新的类MediaSync,它可以帮助实现这一点。)
MediaCodec的优点:
MediaCodec的缺点:
对于提取单个数据包,有一个MediaExtractor类,它对于静态文件的一些常见文件格式非常有用。不过,我不认为它适用于流(例如,分段MP4 )。
因此,如果您想要对MPEG TS之外的格式进行流播放,您需要自己处理数据包的提取(或者使用其他库,例如libavformat来完成该任务)。如果使用OpenMAX AL,则需要将单个数据包打包回MPEG TS (例如使用libavformat)。如果使用MediaCodec,则需要在播放过程中处理音频和视频的同步。
如果您需要对解码的帧进行处理,那么MediaCodec可能是唯一的方法。您可以获得解码图像数据作为原始的YUV,或获得它在GL表面,您可以修改使用着色器。(后者也可以使用OpenMAX AL。)
https://stackoverflow.com/questions/40361649
复制相似问题