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

时间:2013-04-21 07:37:17

标签: h.264 stagefright

有没有办法在Android 2.3或更高版本上直接访问libstagefright.so来解码来自H.264图层的JNI流?

1 个答案:

答案 0 :(得分:11)

如果您的目标是解码基本H.264流,则您的代码必须确保提取流,codec-specific-data将提供给主要为SPS的编解码器和PPS数据和帧数据以及时间戳被提供给编解码器。在所有Android版本中,最常见的接口是OMXCodec,它是对基础OMX组件的抽象。

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

链接到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

主要挑战如下:

  1. 将输入建模为OMXCodec

  2. 读取包装器代码以从编解码器读取缓冲区并处理它并将其释放回编解码器。

  3. 为简化起见,您可以在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实施