解码在Android的原始H264stream?

我有一个项目,我被要求在android中显示videostream,stream是原始的H.264,我连接到服务器,并将从服务器接收字节stream。

基本上我想知道有没有办法将原始字节发送到Android中的解码器,并将其显示在表面上?

我已经成功解码包装在mp4容器中的H264使用Android 4.1中的新的MediaCodec和MediaExtractor API,不幸的是,我还没有find一种方法来解码原始的H264文件或使用这些API的stream。

我明白,一种方法是编译和使用FFmpeg,但我宁愿使用内置的方法,可以使用硬件加速。 我也理解Android的RTSPstream支持,但这不是一个选项。 Android版本不是问题。

Solutions Collecting From Web of "解码在Android的原始H264stream?"

不幸的是,我不能提供任何代码,但是我会尽我所能根据我如何工作解释它。

所以这里是我如何使用MediaCodec类获得原始H.264编码video的概述( http://developer.android.com/reference/android/media/MediaCodec.html )。

使用上面的链接有一个获得解码器设置和如何使用它的例子,你需要设置解码H264 AVC。

H.264的格式是由NAL单元组成的,每个单元的起始前缀为三个字节,其值为0x00,0x00,0x01,每个单元具有不同的types,取决于紧随其后的第4个字节的值3个起始字节。 一个NAL单元不是video中的一个帧,每个帧都由多个NAL单元组成。

基本上我写了一个方法,find每个单位,并将其传递给解码器(一个NAL单元是起始前缀,并在那里的任何字节,直到下一个起始前缀)。

现在,如果您有解码器设置用于解码H.264 AVC,并从解码器有一个InputBuffer,那么您就准备好了。 你需要用一个NAL单元来填充这个InputBuffer,并把它传回解码器,并且继续这个stream的长度。 但是,要做到这一点,我必须先通过解码器一个SPS(序列参数集)NAL单元。 该单元在起始前缀(第4个字节)之后具有0x67的字节值,在某些设备上,解码器将首先失败,除非它首先接收到该单元。 基本上,直到你find这个单位,忽略所有其他的NAL单位,并继续parsingstream,直到你得到这个单位,然后你可以通过所有其他单位的解码器。

有些设备先不需要SPS,有些设备可以,但是最好先通过。

现在,如果你有一个表面,当你configuration它时,你传递给解码器,那么一旦它获得足够的NAL单元的一个框架,它应该显示在表面上。

您可以从服务器上下载原始H.264,然后通过手机上运行的本地HTTP服务器提供,然后让VLC for Android从该服务器上播放。 您应该使用VLC的http / h264://scheme来强制demuxer使用原始的H.264格式(如果您不强制使用demuxer,即使HTTP服务器返回的MIMEtypes为设置正确)。 看到

https://github.com/rauljim/tgs-android/blob/integrate_record/src/com/tudelft/triblerdroid/first/VideoPlayerActivity.java#L211

有关如何创build将启动VLC的Intent的示例。

注意:原始的H.264显然没有定时信息,所以VLC将尽可能快地播放。 首先将其embeddedMPEGTS将会更好。 还没有find一个Android的lib,会做到这一点呢。

以下是我在类似项目中find的有用资源:

  1. 本video非常了解MediaCodec如何处理原始h.264stream。
  2. 这个线程更具体地处理SPS / PPS NALU。 如上所述,您需要使用开始前缀分隔单个NAL单元,然后将其余数据交给MediaCodec。