android - 对 H264 NAL 流进行 fragment 整理(最初是 1722 avb 数据包)

标签 android java-native-interface video-streaming h.264 ethernet

手头的任务:

捕获来自以太网端口的 1722 avb 视频数据包,并在 android 中将它们作为实时视频播放。视频包为NAL H.264码流。

什么是已经可用的:

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

我在找什么:

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

我猜上面的过程叫做 fragment 整理。 fragment 整理后,我会将此视频帧发送到 android video view 并将它们显示在屏幕上。

非常感谢任何有用的资源。

最佳答案

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

enter image description here

访问单元定界符:

如果流具有 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(任意切片顺序)支持是编码器中极为罕见的功能。帧的第一片带有一个标志,表示它是视频帧的开始。 enter image description here

上图由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/

相关文章:

android - 在 TabHost 内更改 Activity 转换

c# - 从 .NET 调用 Java API - 最佳方法

javascript - 如何将动态位图流渲染到 Canvas ?

javascript - 如何通过Node JS获取ffmpeg的具体开始和结束时间?

android - 自动调整编辑文本和按钮的大小和位置

android - 查找两个地理点之间距离的源代码

javah -jni <classname> 不起作用?

java - 如何通过引用将 List 从 Java 作为 vector 传递给 JNI C++?

html - Wowza流引擎在HTML播放器中没有声音

android - 在android中记录SQL查询