如何在Android上使用硬件加速视频解码?

时间:2012-07-04 02:51:41

标签: android video h.264 hardware-acceleration stagefright

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

由于我在网上搜索,我找到了几种在Android上执行硬件加速视频解码的方法。

  1. 使用 ffmpeg libstagefright(overview of libstagefright)或直接在操作系统中使用libstagefright,例如here
  2. 在特定硬件平台上使用 OpenMax 。例如here about samsung devicehere about Qualcomm Snapdragon series
  3. 有人提到 PVplayer
  4. 有些人"say" libstagefright是高通公司明显取得成功的唯一途径。

    目前我不确定哪种方式可行。我现在有点困惑。如果一切正常,我肯定更喜欢与硬件无关的方法。

    由于我用Galaxy Tab 7.7(3.2& Enxyos),VLC,Mobo,Rock,vplayer,rock和mobo测试了几个视频播放器的H / W加速度,VLC无法正常工作,vplayer似乎有一个渲染错误,其成本。

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

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

3 个答案:

答案 0 :(得分:22)

回答上述问题,让我介绍一些与Android相关的概念

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

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

现在回答你的问题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在应用程序级别提供对硬件加速解码器的访问。有关http://developer.android.com/about/versions/android-4.1.html#Multimedia

的新API的更多详细信息

答案 1 :(得分:1)

使用ExoPlayergithub)。

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

它包含一个不错的demo app showing usage

答案 2 :(得分:0)

您可能想尝试MediaExtractorMediaCodec(它们也可以在NDK中使用 - AMediaExtractor和AMediaCodec - 请参阅此处播放.mp4的样本native-codec