手头的任务:
捕获通过以太网端口传来的1722个avb视频数据包,并在android中作为实时视频播放。视频分组是NAL H.264流。
已经可用的内容:
从以太网端口读取数据并捕获数据包的代码已准备就绪。简而言之,我随身携带了有效载荷数据。
我在寻找什么:
我想以上过程称为碎片整理。碎片整理后,我将把该视频帧发送到android视频 View 并在屏幕上显示它们。
任何有用的资源将不胜感激。
最佳答案
首先,我假设您的分析将在NAL单元上进行。下表显示了NAL单元类型的部分列表。在主要的H264编码器实现中,您可能只会找到NAL单元类型1、5、6、7和8。您可能很少发现其他NAL单位。
访问单元定界符:
如果流的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 顺序)支持在编码器中很少见。帧的第一片带有一个标志,指示它是视频帧的开始。
上图是通过组合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 属于下一视频帧,并且是下一视频帧的开始。
我希望这些详细信息将有助于解决您的问题