有没有办法在Android 2.3或更高版本上直接访问libstagefright.so
来解码来自H.264
图层的JNI
流?
答案 0 :(得分:11)
如果您的目标是解码基本H.264
流,则您的代码必须确保提取流,codec-specific-data
将提供给主要为SPS
的编解码器和PPS
数据和帧数据以及时间戳被提供给编解码器。在所有Android
版本中,最常见的接口是OMXCodec
,它是对基础OMX
组件的抽象。
在Gingerbread(Android 2.3)和ICS(Android 4.0.0)中,如果您想创建解码器,最好的方法是创建OMXCodec
组件并通过{{1来抽象代码接口,即您的包装器代码被建模为MediaSource
,MediaSource
从此源读取并执行解码。
链接到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
主要挑战如下:
将输入建模为OMXCodec
。
读取包装器代码以从编解码器读取缓冲区并处理它并将其释放回编解码器。
为简化起见,您可以在http://androidxref.com/4.0.4/xref/frameworks/base/cmds/stagefright/stagefright.cpp#233
中查看MediaSource
命令行可执行代码
但是,如果您的程序基于JellyBean(Android 4.1.x,4.2.x),那么这些稍微简化一些。从您的JNI代码,您可以创建一个stagefright
组件并使用相同的解码。要将其整合到您的计划中,您可以参考http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316
MediaCodec
实施