整理 H264 NAL 流(原始的 1722 avb 数据包)

7

任务:

捕获通过以太网端口传输的1722个AVB视频数据包,并将其作为实时视频在Android上播放。视频数据包是NAL H.264流。

已有资源:

已准备好从以太网端口读取数据并捕获数据包的代码。因此,简而言之,我拥有有效载荷数据。

所需资源:

  1. 可分析这些NAL H264数据包的C代码。
  2. 从连续的有效载荷流中识别起始、中间和结束帧。
  3. 将所有相关的H264 NAL有效载荷组合成一个视频帧。

我想以上过程称为解碎过程。一旦解碎完成,我将把这个视频帧发送到Android视频视图,并在屏幕上显示它们。

任何有用的资源都将不胜感激。


阅读此内容。https://dev59.com/qGAf5IYBdhLWcg3wOQi2#24890903 - szatmary
对于1,您需要C代码还是真正的Java代码?另外,“分析”以何种方式进行(即:您需要检查什么)?可能只需要步骤2和3就足以提取一个准备好解码的帧,就像这个问题中所示。对于步骤2,请遵循@szatmary链接中的建议。 - VC.One
@VC.One 这些天我一直对NAL单元类型感到困惑..有两种NAL单元类型..1. nal_unit_type用于RTP负载中的nal头(RFC 6184),以及H264头的nal单元类型..所以当接收到RTP数据包时,我应该首先解析负载中的nal头并识别rtp数据包的类型..完成后,我应该构造(解碎)H264帧..这个帧将有一个nal单元,其类型在下面的答案中定义。如果我的理解有误,请纠正我..请帮助我处理这个问题。我已经卡了很长时间了.. - Sandeep
1个回答

6

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

enter image description here

访问单元分隔符:

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

NAL单元-6和7:

这三个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”标志被设置,这意味着此新切片属于下一个视频帧,并且是下一个视频帧的开始。
我希望这些详细信息能够帮助解决您的问题。

嗨ARK,我的数据不是字节流,而是AVC格式。大多数数据包具有NAL单元类型28。 - Sandeep
@mk.. H264没有nal单元类型28。H264的nal单元类型24-31未指定。 - Mahmoud Al-Qudsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接