手头的任务:
捕获来自以太网端口的 1722 avb 视频数据包,并在 android 中将它们作为实时视频播放。视频包为NAL H.264码流。
什么是已经可用的:
从以太网端口读取数据并捕获数据包的代码已准备就绪。所以简而言之,我有有效负载数据。
我在找什么:
- 可以分析这些 NAL H264 数据包的 C 代码。
- 从连续的有效负载流中识别开始、中间和结束帧。
- 组合所有相关的 H264 NAL 有效载荷以形成视频帧。
我猜上面的过程叫做 fragment 整理。 fragment 整理后,我会将此视频帧发送到 android video view 并将它们显示在屏幕上。
非常感谢任何有用的资源。
最佳答案
首先,我假设您的分析将在 NAL 单元上进行。下表显示了 NAL 单元类型的部分列表。在主要的 H264 编码器实现中,您可能只会找到 NAL 单元类型 1、5、6、7 和 8。您可能很少会发现其他 NAL 单元。
访问单元定界符:
如果流具有 NAL 单元号 9,即访问单元定界符,则您的问题更容易解决。所有 NAL 单元,在 2 个 Access Unit delmiter NAL 单元之间,属于单个视频帧。由于此 NAL 单元类型是可选的,因此大多数编码器通常会跳过嵌入此 NAL 单元。所以。很可能你在你的流中找不到这个 NAL 单元
NAL 单元 - 6 和 7:
这 3 个 NAL 单元不直接参与解 fragment ,但需要它们进行解码操作。在大多数情况下,这两种类型在一个序列中只出现一次,即在视频序列的开头。
NAL 单元 - 1 和 5:
这些是对 fragment 整理至关重要的 NAL 单元。对于给定的视频帧,所有 NAL 单元都应携带相同的 NAL 单元,即 1 或 5。这些 NAL 携带帧的切片。我假设切片是按顺序排列的,因为 ASO(任意切片顺序)支持是编码器中极为罕见的功能。帧的第一片带有一个标志,表示它是视频帧的开始。
上图由H264标准的2个部分表(此处仅相关)组合而成。
一旦你解码了 NAL 头(1 字节信息),你就会弄清楚它是 NAL 类型 1 还是 5(切片 NAL 单元)。一旦发现 NAL 作为切片单元,就解析流中的“first_mb_in_slice”符号(此信息紧跟在 NAL header 信息的 1 字节之后)。如果设置了此标志,则这是视频帧的第一个切片。后续 NAL 单元会将此标志设置为零,直到当前视频帧的最后一个 fragment 。如果发现设置了切片 NAL 单元的“first_mb_in_slice”标志,则意味着这个新切片属于下一个视频帧,并且是下一个视频帧的开始。
我希望这些细节能帮助您解决问题
关于android - 对 H264 NAL 流进行 fragment 整理(最初是 1722 avb 数据包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38760650/