gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:42 34 4
gpt4 key购买 nike

我正在为 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) 接口(interface)。那么我应该使用 stagefright 还是 OpenMax IL?哪个更有前途?

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

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

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

编辑

我的软件是用于商业目的,源代码也是私有(private)的。而且我也被客户端限制使用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=b31df501269b56c65327be181cdca3df48946fb1作为使用 JNI 从 C 代码使用 MediaCodec 的示例。由于其他人也采用了这种方式,我可以向您保证,除了 MediaCodec 之外,JNI 开销不是考虑其他 API 的理由。

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

关于c++ - 开发 H264 硬件解码器 Android - Stagefright 或 OpenMax IL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427289/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com