【发布时间】:2013-04-14 06:48:24
【问题描述】:
有没有办法直接访问libstagefright.so 以在Android 2.3 或更高版本上从JNI 层解码H.264 流?
【问题讨论】:
标签: h.264 stagefright
有没有办法直接访问libstagefright.so 以在Android 2.3 或更高版本上从JNI 层解码H.264 流?
【问题讨论】:
标签: h.264 stagefright
如果您的目标是解码基本的H.264 流,那么您的代码必须确保提取流,将codec-specific-data 提供给主要是SPS 和PPS 数据的编解码器和帧数据连同时间戳一起提供给编解码器。在所有Android 版本中,最常见的接口是OMXCodec,它是对底层OMX 组件的抽象。
在 Gingerbread (Android 2.3) 和 ICS (Android 4.0.0) 中,如果您想创建一个解码器,最好的方法是创建一个 OMXCodec 组件并通过 MediaSource 接口抽象您的代码,即您的包装代码被建模为MediaSource 和OMXCodec 从该源读取 并执行解码。
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 4.1 即JellyBean 中,显示管道经历了一些重大改进。您能否分享一些日志以进行进一步分析?我建议从SurfaceTexture、HwComposer 和Layer 模块进行日志记录。附注:您的layer 是否出于某种原因被标记为安全?