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

Gle*_* Yu 33 video android h.264 hardware-acceleration stagefright

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

正如我在网上搜索一样,我发现了一些在Android上执行硬件加速视频解码的方法.

  1. 使用ffmpeg libstagefright(libstagefright 概述)或直接在OS中使用libstagefright,就​​像这里一样.
  2. 在特定硬件平台上使用OpenMax.像这里关于三星设备这里关于高通Snapdragon系列
  3. 有人提到PVplayer,

有些人"说" libstagefright是高通球员明显取得成功的唯一途径.

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

由于我用Galaxy Tab 7.7(3.2和Enxyos),VLC,Mobo,Rock,vplayer,rock和mobo测试了几个视频播放器的H/W加速度,VLC无法正常工作,vplayer似乎有渲染花费其性能的bug.

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

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

Oak*_*tes 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在应用程序级别提供对硬件加速解码器的访问.有关新API的更多详细信息,请访问http://developer.android.com/about/versions/android-4.1.html#Multimedia

  • RockPlayer是近源的,只有ffmpeg的配置是开放的,因此我不确定它使用的是什么.我的猜测是在解复后的Rockplayer中,将原始视频输入交换机,让用户从其第三方解码器或hw系统解码器中选择其菜单建议,然后进行处理和显示.我在Honeycomb 3.2下进行了Rockplayer实验.因此,似乎有一种方法可以在没有NDK/JNI的情况下使用系统编解码器,并不是说NDK太麻烦了,而是探索了可靠性. (2认同)