对H264 NAL流进行碎片整理(最初为1722个avb数据包)

时间:2016-08-04 07:08:59

标签: android java-native-interface video-streaming h.264 ethernet

手头的任务:

通过以太网端口捕获1722个avb视频数据包,并在android中将其作为实时视频播放。视频数据包是NAL H.264流。

现有资料:

从以太网端口读取数据并捕获数据包的代码已准备就绪。简而言之,我随身携带了有效载荷数据。

我在寻找:

  1. 可以分析这些NAL H264数据包的C代码。
  2. 从连续的有效负载流中识别起始帧,中间帧和结束帧。
  3. 合并所有相关的H264 NAL有效负载以形成视频帧。
  4. 我猜上面的过程称为去碎片。一旦去碎片化,我将把这个视频帧发送到Android视频视图并在屏幕上显示它们。

    非常感谢任何有用的资源。

1 个答案:

答案 0 :(得分:4)

首先,我假设您的分析是在NAL单位上进行的。下表显示了NAL单元类型的部分列表。在主要的H264编码器实现中,您可能只能找到NAL单元类型1,5,6,7和8。您很少会找到其他NAL单位。

enter image description here

访问单元分隔符:

如果流具有NAL单元号9即访问单元分隔符,则您的问题更容易解决。在2个访问单元目录器NAL单元之间的所有NAL单元属于单个视频帧。由于该NAL单元类型是可选的,因此大多数编码器通常跳过嵌入该NAL单元。所以。您极有可能在流中找不到此NAL单元

NAL单位 - 6& 7:

这3个NAL单元不直接参与解帧,但是它们需要用于解码操作。在大多数情况下,这两种类型只在序列中出现一次,即在视频序列的开头。

NAL单位 - 1& 5:

这些是对碎片化至关重要的NAL单位。对于给定的视频帧,所有NAL单元应携带相同的NAL单元,即1或5.这些NAL携带帧的片段。我假设切片是有序的,因为ASO(任意切片顺序)支持是在编码器中找到的极其罕见的特征。帧的第一个片段带有一个标志,表示它是视频帧的开始。 enter image description here

上图是通过组合H264标准的2个部分表(这里只是相关的)来形成的。

解码NAL标头(1字节信息)后,您将确定它是NAL类型1还是5(切片NAL单元)。一旦找到NAL作为切片单元,解析流为“first_mb_in_slice”符号(该信息在NAL头信息的1字节之后立即出现)。如果设置了此标志,则这是视频帧的第一个片段。以下NAL单元将该标志作为零,直到当前视频帧的最后一个片段。如果发现切片NAL单元的“first_mb_in_slice”标志被设置,则意味着该新切片属于下一视频帧并且是下一视频帧的开始。

我希望这些细节有助于解决您的问题