在Android的解码原始H264流?在Android的解码原始H264流?(Decoding Ra

2019-05-13 00:04发布

我有,我一直在问在android系统显示视频流的项目,流是原始H.264和我连接到服务器,并从服务器接收字节流。

基本上,我不知道是有办法的原始字节发送给解码器在Android和表面上显示呢?

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

据我所知,一个办法是编译和使用FFmpeg的,但我宁愿使用的方法,可以使用硬件加速内置。 我也明白RTSP流支持android系统,但是这是不是一种选择。 Android版本是不是一个问题。

Answer 1:

我不能为此提供任何代码很遗憾,但我会尽我所能基于我如何得到它的工作来解释它。

因此,这里是我的我是如何得到的原始H.264编码的视频使用工作概述MediaCodec类。

使用上面的链接是需要有一个解码器设置以及如何使用它,你需要将其设置为H264 AVC解码的例子。

H.264的格式是,它是由NAL单元,每个单元开始的三个字节与值0×00,0×00,0×01开始前缀和每个单元都有不同的类型取决于这些之后的第四个字节权价值3个开始字节。 一个NAL 单元未在视频的一帧,每个帧由若干NAL单元。

基本上我写道,发现每个单独的单元,并将它传递到解码器(一个NAL单元是所述起始前缀和有之后直到下一次起动前缀任何字节)的方法。

现在,如果你有H.264 AVC解码解码器设置,并有来自解码器的INPUTBUFFER那么你就准备好了。 您需要填写此INPUTBUFFER与NAL单元,并将其传递回解码器,并继续做这个流的长度。 但是,为了使这项工作,我不得不通过解码器中的SPS(序列参数集)NAL单元第一。 此单元具有的起始前缀(第4个字节),在某些设备上,除非它首先接收到该单元中的译码器将崩溃之后的0×67字节值。 基本上,直到你找到这个单位,忽略所有其他的NAL单元和保持解析流,直到你得到这个单位,那么你可以通过所有其他单位的解码器。

有些设备不首先需要的SPS有的没有,但你通过它在第一的好。

现在,如果你有,你传递给解码器,当你一旦得到足够的NAL单元应该显示它表面上的帧配置它,然后在表面。



Answer 2:

您可以从服务器上下载的原始H.264,然后通过在手机上运行的本地HTTP服务器提供,然后让VLC的Android也从HTTP服务器播放。 您应该使用VLC的HTTP / H264://方案给力的分路器原始H.264(如果你不逼分路器VLC可能无法识别流,即使由HTTP服务器返回的MIME类型正确设置)。 看到

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

关于如何创建一个Intent将推出VLC的例子。

注:原H.264显然没有定时信息,所以VLC将发挥尽可能快的。 首先在MPEGTS嵌入它会更好。 有没有发现一款Android lib中,将做到这一点呢。



Answer 3:

下面是我在一个类似的项目中找到有用的资源:

  1. 此视频在了解MediaCodec如何处理在高水平的原始H.264流过超级见地。
  2. 该线程进入一点更详细地专门处理SPS / PPS的NALU。 正如上面提到的,你需要使用开始前缀其余数据分开单独NAL单元,然后交给了​​MediaCodec。
  3. 此回购 (libstreaming)是解码使用RTSP / RTP用于传输在一个Android的H264流的一个很好的例子。


文章来源: Decoding Raw H264 stream in android?