手头的任务:

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

已经可用的内容:

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

我在寻找什么:

  • 可以分析这些NAL H264数据包的C代码。
  • 从连续的有效负载流中标识开始帧,中间帧和结束帧。
  • 组合所有相关的H264 NAL有效负载以形成视频帧。

  • 我想以上过程称为碎片整理。碎片整理后,我将把该视频帧发送到android视频 View 并在屏幕上显示它们。

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

    最佳答案

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

    android - 碎片整理H264 NAL流(最初为1722个AVB数据包)-LMLPHP

    访问单元定界符:

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

    NAL单位-6和7:

    这3个NAL单元不直接参与分解,但需要它们进行解码操作。在大多数情况下,这2种类型在序列中(即在视频序列的开头)仅出现一次。

    NAL单位-1和5:

    这些是NAL单元,对于碎片整理至关重要。对于给定的视频帧,所有NAL单元应携带相同的NAL单元,即1或5。这些NAL携带帧的 slice 。我认为 slice 是按顺序排列的,因为ASO(任意 slice 顺序)支持在编码器中很少见。帧的第一片带有一个标志,指示它是视频帧的开始。
    android - 碎片整理H264 NAL流(最初为1722个AVB数据包)-LMLPHP

    上图是通过组合H264标准的2个部分表(仅在此处相关)形成的。

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

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

    08-05 19:58