开发 H264 硬件解码器 Android - Stagefright 或 OpenMax IL?

Developing H264 hardware decoder Android - Stagefright or OpenMax IL?

我正在为 android 开发 H264 H/W 加速视频解码器。到目前为止,我已经使用了一些库 MediaCodecStagefrightOpenMax ILOpenMax ALFFmpeg。经过一番研究,我发现 -

  1. 我找到了一个great resource 将stagefright 与FFmpeg 一起使用,但我不能使用FFmpeg,因为它的许可证,它对分布式软件有相当的限制。 (或者可以从这种方法中丢弃 FFmpeg 吗?)

  2. 我不能将 MediaCodec 用作 Java API 并且我必须通过 C++ 层的 JNI 调用它,这相对较慢而且我不允许。

  3. 我不能使用 OpenMax AL,因为它只支持通过缓冲队列解码 MPEG-2 传输流。这排除了通过原始 h264 NALU 或其他媒体格式的可能性。

  4. 现在只剩下-stagefright和OpenMax IL了。我开始知道 stagefright 使用 OpenMax(OMX) 接口。那么我应该使用 stagefright 还是 OpenMax IL?哪个更有前途?

此外,我了解到 Android H/W 加速解码器是特定于供应商的,每个供应商都有自己的 OMX 接口 API。是真的吗?如果是这样,我是否需要编写 H/W 供应商特定的 OpenMax IL 实现?怯场怎么办? - 它是硬件不可知论者还是硬件依赖者?如果没有办法H/W使用stagefright或OpenMax IL独立实现,我需要至少支持Qualcomm的Snapdragon,Samsung的Exynos和Tegra-4。

请注意,我需要解码 H264 Annex B 流并期望解码后的解码数据将发送到我的视频渲染管道。所以基本上,我只需要解码器模块。

我真的很困惑。请帮我把正确的方向。提前致谢!

编辑

我的软件是用于商业目的,源代码也是私有的。而且我也被客户端限制使用ffmpeg。 :)

I found a great resource of using stagefright with FFmpeg, but I can not use FFmpeg as for its license, it is quite restrictive for distributed software. (Or possible to discard FFmpeg from this approach?)

事实并非如此。 FFmpeg 是 LGPL,因此您可以在您的商业可再发行应用程序中使用它。

但是,您可能正在使用已获得 GPL 许可的 FFmpeg 模块,例如libx264。在这种情况下,您的程序必须符合 GPL。

但这对分发软件来说也不是什么坏事——它只是意味着您需要让您的客户(无论如何,他们应该是国王)访问他们所付费用的应用程序的源代码,并且不允许限制他们的自由。不错,恕我直言。

Also, I came to know that Android H/W accelerated decoder is vendor specific and every vendors has their own OMX interfacing APIs. Is it true?

显然,是的。如果你需要硬件加速,就必须有人编写一个程序,让你的特定硬件加速某些东西。

你真的应该选择 MediaCodec。通过 JNI 调用 java 方法确实有一些开销,但您应该记住开销的数量级。如果您要为每个像素调用一个函数,那么 JNI 调用的开销可能会出现问题。但是使用MediaCodec,每帧只需要调用几个函数,开销可以忽略不计。

参见例如http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/mediacodec_jni.c;h=57df9889c97706436823a4960206e323565e221c;hb=b31df501269b56c65327be181cdca3df48946fb1 作为使用 JNI 从 C 代码使用 MediaCodec 的示例。由于其他人也采用这种方式,我可以向您保证,除了 MediaCodec 之外,JNI 开销不是考虑其他 API 的理由。

直接使用stagefright或者OMX是有问题的;每个平台版本之间的 ABI 不同(因此您可以只针对一个版本,或者针对不同版本多次编译,将它们全部打包在一个包中),并且您必须处理很多设备特定的怪癖,而MediaCodec 应该(并且在现代版本上)在所有设备上工作相同。