35

我需要一个研究项目的硬件加速 H.264 解码,以测试自定义协议。

当我在网上搜索时,我发现了几种在 Android 上执行硬件加速视频解码的方法。

  1. 使用ffmpeg libstagefright(libstagefright概述)或直接在操作系统中使用 libstagefright,如此
  2. 在特定硬件平台上使用OpenMax 。喜欢这里关于三星设备这里关于高通骁龙系列
  3. 有人提到PVplayer

有些人“说” libstagefright 是唯一的方法,而高通公司的人显然已经取得了成功。

目前我不确定哪种方式可行。我现在有点困惑。如果一切正常,我当然更喜欢独立于硬件的方法。

由于我已经使用 Galaxy Tab 7.7(3.2 和 Enxyos)测试了一些视频播放器的硬件加速,VLC、Mobo、Rock、vplayer、rock 和 mobo 工作正常,VLC 不起作用,vplayer 似乎有渲染损害其性能的错误。

无论如何,我对 Rockplayer 进行了“操作”并删除了它在 data\data\com.redirecting\rockplayer 中的所有 .so 库,并且软件解码崩溃,而硬件解码仍然可以正常工作!我想知道他们是怎么做到的。在我看来,硬件加速可以独立于硬件平台。

有人可以解决这个问题吗?或者提供任何参考以提供更多信息或更好的细节?

4

3 回答 3

22

为了回答上面的问题,我先介绍几个与Android相关的概念

OpenMAX Android 使用 OpenMAX 作为编解码器接口。因此,所有本机编解码器(硬件加速或其他)都提供 OpenMAX 接口。StageFright(播放器框架)使用此接口使用编解码器解码媒体

NDK Android 允许 Java 应用程序使用 NDK 与底层 C/C++ 本机库进行交互。这需要使用 JNI(Java 本机接口)。

现在来回答你的问题How to tap native decoder to decode raw video bitstream?

在 Android 4.0 及以下版本中,Android 不提供对 Java 层底层视频解码器的访问。您需要编写本机代码才能直接与 OMX 解码器交互。尽管这是可能的,但这并不是一件小事,因为它需要了解 OMX 的工作原理以及如何使用 NDK 将此 OMX 映射到应用程序。

在 4.1(Jelly Bean 版本)中,Android 似乎通过 JAVA API 在应用程序级别提供了对硬件加速解码器的访问。有关新 API 的更多详细信息,请访问http://developer.android.com/about/versions/android-4.1.html#Multimedia

于 2012-07-07T22:19:18.810 回答
1

使用ExoPlayer ( github )。

它是一个由谷歌赞助的开源项目,取代了平台的 MediaPlayer。管道中的每个组件都是可扩展的,包括示例源(如何从自定义协议中提取 H.264 帧)到渲染(到 Surface、SurfaceTexture 等)。

它包括一个很好的演示应用程序,显示使用情况

于 2016-05-11T22:23:24.153 回答
1

您可能想尝试MediaExtractorMediaCodec(它们也可用于 NDK - AMediaExtractor 和 AMediaCodec - 请参阅此处播放 .mp4 的示例native-codec

于 2017-03-13T12:11:18.277 回答