安卓硬件加速视频解码器用于H264流

5
我正在开发一个Android硬件加速视频解码器,用于解码实时H264 Annex B流。经过一些研究,似乎我需要动手去做这个。我遇到了几个关键词,如OMXCodec、Android的操作系统stagefright和ffmpeg的stagefrightMediaCodec API、GStreamer。我也知道 - 没有方法让硬件无关的实现支持所有供应商的硬件。在这个阶段,所有这些对我来说都太困惑了,因为我没有找到任何直接前进任何一个的资源。我的要求是 -
  1. Android硬件加速视频解码器
  2. 支持至少高通的Snapdragon、三星的Exynos和Tegra
  3. 实现必须在本地C/C++层(而不是Java层)
  4. 从Android 4.1.x Jellybean开始支持
  5. 不需要实现后续阶段,如渲染,因为这些已经工作正常。只需解码输入缓冲区并生成解码后的输出缓冲区即可继续使用现有管道。
我试图从Android的stagefright的AwesomePlayer.cpp、SimplePlayer.cpp和ffmpeg stagefright的命令行可执行文件代码中获取一些提示。但是,对我来说,没有什么意义可以选择并继续使用这些东西。
我该如何处理?有没有有用的资源可以获得清晰的直觉?
提前致谢!
1个回答

4

最近我使用MediaCodec API实现了这样一个系统。不幸的是,该API在NDK中没有公开,因此只能从Java层访问。

我发现的最好资源是这些指南:

http://bigflake.com/mediacodec/

既然您有在NDK中实现这个的硬性要求,那么我猜您需要编写一个轻量级的Java库来与MediaCodec API进行交互,然后通过JNI从C++层调用它。

如果您选择使用FFMPEG,请注意其许可证,它对分发软件是相当限制的。

祝好运!


谢谢您的建议。是的,我也被告知要避免使用ffmpeg因为它的许可问题。我提出了JNI接口MediaCodec API的方法,但如果我能在纯C/C++层面上实现它会更好。有一个问题,您是否需要做额外的工作来支持不同厂商的硬件?还是您的实现是硬件无关的? - Kaidul
理论上,MediaCodec API 是硬件无关的,实际上我迄今为止观察到了这一点 - 它在我尝试过的每个设备上都可以工作。 - Dean Wild
1
FYI,我同时进行编码和解码,并使用了在API级别18中引入的MediaCodec功能。由于您只需要解码,因此可能可以回到API级别16。 - Dean Wild
再次感谢提供这些信息!还有一个问题,通过jni访问Java层的API是否比仅使用C/C++更具性能优势? - Kaidul
我听说使用JNI调用相对比较昂贵。这会影响性能吗?难以说。这取决于您的所需的比特率、帧率、延迟要求等因素。 - Dean Wild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接