首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MediaCodec与OpenMAX在安卓手机上的游戏(Snapdrae820)使用C++

MediaCodec与OpenMAX在安卓手机上的游戏(Snapdrae820)使用C++
EN

Stack Overflow用户
提问于 2016-11-01 14:03:09
回答 1查看 2.6K关注 0票数 2

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

我的问题是:

  1. 这是在手机上使用硬件解码器的最佳方式(Android上的Snap巨龙820 )吗?
  2. 在MediaCodec上使用OMX有什么好处吗?当前的Android头实际上只支持MPEG2 2/..ts mimetype。我希望您能支持视频流解码(mp4等)。通过OpenMax -这是正确的评估吗?

我的要求是:

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

我已经用ffmpeg编写了基本的播放器,但我无法使用硬件解码器,所以没有遵循它。

我是开放的任何其他框架(免费或商业),将完成上述。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 22:00:55

一般来说,推荐的是MediaCodec。

OpenMAX API是在Android4.0中作为权宜之计添加的,后来MediaCodec才在Android4.1中发布。这实际上是不可取的(尽管我不确定是否有官方声明这样说)。

它们在稍微不同的抽象级别上操作,在大多数情况下,MediaCodec的工作较少。

使用OpenMAX AL,您需要提供一个MPEG TS数据流来解码和回放。它不支持其他容器格式。它也不允许您直接访问已解码的数据,但它将直接回放。然而,它确实负责音频和视频的同步。

OpenMAX AL的优点:

  • 如果您的输入是MPEG TS,则避免整个额外步骤。
  • 句柄自动同步

缺点:

  • 其他一切

使用MediaCodec,您需要提供要解码的单个数据包。它本身根本不支持任何容器格式,但是您作为调用者应该负责处理这个问题。它确实允许您直接访问已解码的输出数据,但是要显示它,您需要手动处理同步。(在Android6.0中,有一个新的类MediaSync,它可以帮助实现这一点。)

MediaCodec的优点:

  • 通用的、灵活的
  • 适用于任何容器(不需要重新打包到MPEG TS)

MediaCodec的缺点:

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

对于提取单个数据包,有一个MediaExtractor类,它对于静态文件的一些常见文件格式非常有用。不过,我不认为它适用于流(例如,分段MP4 )。

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

如果您需要对解码的帧进行处理,那么MediaCodec可能是唯一的方法。您可以获得解码图像数据作为原始的YUV,或获得它在GL表面,您可以修改使用着色器。(后者也可以使用OpenMAX AL。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40361649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档