有没有办法libstagefright.so
直接从Android 2.3 或更高版本H.264
的层访问解码流?JNI
1 回答
如果您的目标是解码基本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
组件并使用它进行解码。要将其集成到您的程序中,您可以参考http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316SimplePlayer
中的实现