我正在为 Android 开发 H264 H/W 加速视频解码器。到目前为止,我已经接触过一些图书馆MediaCodec
, Stagefright
, OpenMax IL
, OpenMax AL
and FFmpeg
。经过一番研究,我发现 -
-
我找到了一个很棒的资源 https://vec.io/posts/use-android-hardware-decoder-with-omxcodec-in-ndk与 FFmpeg 一起使用 stagefright,但我不能使用 FFmpeg 因为它的许可证,它对分布式软件有很大的限制。 (或者可以从这种方法中丢弃 FFmpeg 吗?)
-
我不能使用 MediaCodec 作为 Java API,我必须通过 C++ 层的 JNI 调用它,这相对较慢,而且我不允许。
-
我无法使用 OpenMax AL,因为它仅支持通过缓冲区队列解码 MPEG-2 传输流。这排除了传递原始 h264 NALU 或其他媒体格式的可能性。
-
现在只剩下 - stagefright 和 OpenMax IL。我了解到stagefright使用OpenMax(OMX)接口。那么我应该选择 stagefright 还是 OpenMax IL?哪个会更有前途?
另外,我了解到 Android 硬件加速解码器是特定于供应商的,每个供应商都有自己的 OMX 接口 API。这是真的吗?如果是这样,我是否需要在 OpenMax IL 的情况下编写硬件供应商特定的实现?怯场怎么办? - 与硬件无关还是依赖于硬件?如果没有办法使用 stagefright 或 OpenMax IL 进行硬件独立实现,我至少需要支持高通的 Snapdragon、三星的 Exynos 和 Tegra-4。
请注意,我需要解码 H264 附件 B 流,并期望解码后的解码数据将发送到我的视频渲染管道。所以基本上,我只需要解码器模块。
我真的很困惑。请帮助我找到正确的方向。提前致谢!
EDIT
我的软件是用于商业目的,源代码也是私有的。而且我也被客户端限制使用 ffmpeg。 :)
你真的应该选择 MediaCodec。通过 JNI 调用 java 方法确实会产生一些开销,但您应该记住开销的数量级。如果您按像素调用一个函数,JNI 调用的开销可能会出现问题。但对于使用 MediaCodec,每帧只需执行几个函数调用,并且开销可以忽略不计。
参见例如http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/mediacodec_jni.c;h=57df9889c97706436823a4960206e323565e221c;hb=b31df501269b56c65327be181cdca3df4894 6fb1 http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/mediacodec_jni.c;h=57df9889c97706436823a4960206e323565e221c;hb=b31df501269b56c65327be181cdca3df48946fb1作为使用 JNI 从 C 代码使用 MediaCodec 的示例。由于其他人也采用了这种方式,我可以向您保证,JNI 开销并不是考虑 MediaCodec 之外的其他 API 的理由。
直接使用 stagefright 或 OMX 是有问题的;每个平台版本之间的 ABI 有所不同(因此您可以只针对一个版本,或者针对不同版本进行多次编译,将其全部打包在一个包中),并且您必须处理许多特定于设备的怪癖,而MediaCodec 应该(并且在现代版本上)在所有设备上都以相同的方式工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)