碎片整理H264 NAL流(原始1722个avb数据包)

任务在手:

通过以太网端口捕获1722个AVB视频数据包并在Android中作为实时视频播放。 视频分组是NAL H.264流。

什么已经可用:

从以太网端口读取数据并捕获数据包的代码已准备就绪。 总之,我有我的有效载荷数据。

我在找什么:

  • C代码可以分析这些NAL H264数据包。
  • 识别来自连续的有效载荷流的开始帧,中间帧和结束帧。
  • 结合所有相关的H264 NAL有效载荷形成一个视频帧。
  • 我想上面的过程叫做去碎片。 一旦解除碎片化,我会将这个视频帧发送到android视频视图并将它们显示在屏幕上。

    任何有用的资源将非常感激。


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

    在这里输入图像描述

    访问单元分隔符:

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

    NAL单位 - 6和7:

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

    NAL单位 - 1和5:

    这些是对拆分至关重要的NAL单元。 对于给定的视频帧,所有的NAL单元应该携带相同的NAL单元,即1或5个。这些NAL携带帧的切片。 由于ASO(任意片顺序)支持在编码器中非常罕见,因此我假定片顺序排列。 该帧的第一个切片带有一个标志,表示它是视频帧的开始。 在这里输入图像描述

    以上图片由H264标准结合2个部分表格(仅此处相关)组成。

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

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

    链接地址: http://www.djcxy.com/p/92799.html

    上一篇: Defragment H264 NAL stream (Originally 1722 avb packets)

    下一篇: Python binding for MuJoCo physics library using mujoco