直接访问 StageFright.so 以在 Android 中从 JNIlayer 解码 H.264 流

Posted

技术标签:

【中文标题】直接访问 StageFright.so 以在 Android 中从 JNIlayer 解码 H.264 流【英文标题】:Access StageFright.so directly to decode H.264 stream from JNIlayer in Android 【发布时间】:2013-04-14 06:48:24 【问题描述】:

有没有办法直接访问libstagefright.so 以在android 2.3 或更高版本上从JNI 层解码H.264 流?

【问题讨论】:

【参考方案1】:

如果您的目标是解码基本的H.264 流,那么您的代码必须确保提取流,将codec-specific-data 提供给主要是SPSPPS 数据的编解码器和帧数据连同时间戳一起提供给编解码器。在所有Android 版本中,最常见的接口是OMXCodec,它是对底层OMX 组件的抽象。

在 Gingerbread (Android 2.3) 和 ICS (Android 4.0.0) 中,如果您想创建一个解码器,最好的方法是创建一个 OMXCodec 组件并通过 MediaSource 接口抽象您的代码,即您的包装代码被建模为MediaSourceOMXCodec 从该源读取 并执行解码。

Android 2.3 视频解码器创建链接:http://androidxref.com/2.3.6/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1094

链接到 Android 4.0.0 视频解码器创建:http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1474

主要挑战如下:

    将输入建模为MediaSource

    读取包装器代码以从编解码器中读取缓冲区并对其进行处理并将其释放回编解码器。

为简单起见,您可以查看stagefright 命令行可执行代码,如http://androidxref.com/4.0.4/xref/frameworks/base/cmds/stagefright/stagefright.cpp#233

但是,如果您的程序基于 JellyBean(Android 4.1.x、4.2.x)以后,那么这些会稍微简化一些。从您的 JNI 代码中,您可以创建一个 MediaCodec 组件并将其用于解码。要将其集成到您的程序中,您可以参考SimplePlayer 实现,如http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316

【讨论】:

我在Android上用libstagefright硬件解码视频,主要模仿AwesomePlayer.cpp,调用OMXCodec,在Android 4.0上没问题,但是在Android 4.1上就黑屏了,你有什么建议吗? @CrossleSong 在Android 4.1JellyBean 中,显示管道经历了一些重大改进。您能否分享一些日志以进行进一步分析?我建议从SurfaceTextureHwComposerLayer 模块进行日志记录。附注:您的layer 是否出于某种原因被标记为安全? 感谢您的回答。我已经解决了这个问题,因为 ANativeWindow 问题。缺少 native_window_set_scaling_mode(mNativeWindow.get(),mVideoScalingMode);

以上是关于直接访问 StageFright.so 以在 Android 中从 JNIlayer 解码 H.264 流的主要内容,如果未能解决你的问题,请参考以下文章