【问题标题】:Android hardware accelerated video decoder for H264 stream用于 H264 流的 Android 硬件加速视频解码器
【发布时间】:2015-11-29 00:42:42
【问题描述】:

我正在开发一个 Android 硬件加速视频解码器,用于解码实时 H264 Annex B 流。经过一番研究,似乎我需要弄脏自己的手才能做到这一点。我遇到了几个关键字,例如OMXCodec、Android 的操作系统stagefright 和ffmpeg 的stagefright、MediaCodec 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 的命令行可执行代码中得到一些提示。但对我来说,选择和继续这些东西没有什么意义。

我该如何接近?是否有任何有用的资源来获得清晰的直觉?

提前致谢!

【问题讨论】:

    标签: android h.264 android-mediacodec hardware-acceleration stagefright


    【解决方案1】:

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

    我找到的最好的资源是这套指南:

    http://bigflake.com/mediacodec/

    由于您有在 NDK 中实现此功能的硬性要求,因此我想您需要编写一个精简的 Java 库来与 MediaCodec API 进行交互,然后通过您的 C++ 层的 JNI 调用它。

    如果你走 FFMPEG 路线,请注意它的许可证,它对分布式软件有很大的限制。

    祝你好运!

    【讨论】:

    • 感谢您的建议。是的,我还被告知要避免使用 ffmpeg 的许可证问题。我还提出了JNI interfacing approach of MediaCodec API 方式,但如果我能在纯 C/C++ 层中做到这一点会更好。一个问题,您是否需要做额外的工作来支持不同供应商的硬件?或者您的实现是独立于硬件的?
    • 理论上,MediaCodec API 与硬件无关,而且到目前为止我确实观察到了这一点 - 它在我迄今为止尝试过的所有设备上都有效。
    • 仅供参考,我同时进行了编码和解码,并使用了 API 级别 18 中引入的 MediaCodec 功能。由于您只需要解码,因此可能可以回到 API 级别 16。
    • 再次感谢您提供这些信息!还有一个问题,通过 jni 访问 Java 层的 API 而不是仅使用 C/C++ 访问 Java 层的 API 是否有任何性能问题?
    • 听说JNI调用比较贵。会影响你的表现吗?很难说。取决于您所需的比特率、帧速率、延迟要求等。
    猜你喜欢
    • 2014-03-21
    • 2012-10-08
    • 2012-07-04
    • 1970-01-01
    • 2014-05-13
    • 2019-03-16
    • 2015-09-29
    • 2015-12-02
    • 2011-11-07
    相关资源
    最近更新 更多