6

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

4

1 回答 1

11

如果您的目标是解码基本H.264流,那么您的代码将必须确保提取流,并将codec-specific-data其提供给主要的编解码器,SPS并将PPS数据和帧数据以及时间戳一起提供给编解码器。在所有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

主要挑战如下:

  1. 将输入建模为MediaSource.

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

为简化起见,您可以查看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中的实现

于 2013-04-22T16:30:00.603 回答