从 pcap rtp 捕获中获取 h.265 视频文件
get h.265 video file from pcap rtp capture
我正在尝试从 h.265 编码和未加密的 rtsp/rtp pcap 捕获中提取视频文件。我尝试提取 rtp 流原始数据并尝试使用 vlc 播放它但没有工作。有什么方法可以从 pcap 捕获中获取 h.265 视频文件。
其实,这是一件棘手的事情。 http://ucsniff.sourceforge.net/videosnarf.html 为 h264 实现了类似的概念,但他们不支持 h265,所以我采用了该方法。主要思想是你必须添加一些缺失的部分。
正如https://www.rfc-editor.org/rfc/rfc7798中提到的,header是这样的:
+---------------+---------------+
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F| Type | LayerId | TID |
+-------------+-----------------+
您必须为每个基本流数据包添加删除的 header,这是 4 字节 (00 00 00 01)。
但是我们都知道h265包太长而且大部分都是分片的,据我了解像VLC这样的播放器是不支持分片的。所以你必须重新组装它们。
此过程仅适用于分段数据包类型(如 49)。你有一个额外的 header 是这样的:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E| FuType |
+---------------+
位 S 和 E 告诉您如何重组数据包。序列中的第一个数据包有 S,E = 1,0,其他数据包有 S,E = 0,0(可能是多个数据包),最后一个数据包有 S,E = 0,1。所有有效负载字节都被连接起来,然后通过将主 header 中的类型替换为此处提到的 FuType 来创建一个新的 header(不要忘记 4Byte header):
+---------------+---------------+--------------
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------
|F| FuType | LayerId | TID | all the concatenated payloads
+-------------+-----------------+---------------
请记住,您必须同时保留碎片化和非碎片化的有效载荷,因为大多数未碎片化的数据包都包含不可省略的重要信息,例如图片大小。基本流可以通过 SMplayer 播放,也可以使用 VLC。
对于 VLC,您必须将 demuxer 设置为 h265。
我正在尝试从 h.265 编码和未加密的 rtsp/rtp pcap 捕获中提取视频文件。我尝试提取 rtp 流原始数据并尝试使用 vlc 播放它但没有工作。有什么方法可以从 pcap 捕获中获取 h.265 视频文件。
其实,这是一件棘手的事情。 http://ucsniff.sourceforge.net/videosnarf.html 为 h264 实现了类似的概念,但他们不支持 h265,所以我采用了该方法。主要思想是你必须添加一些缺失的部分。
正如https://www.rfc-editor.org/rfc/rfc7798中提到的,header是这样的:
+---------------+---------------+
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F| Type | LayerId | TID |
+-------------+-----------------+
您必须为每个基本流数据包添加删除的 header,这是 4 字节 (00 00 00 01)。
但是我们都知道h265包太长而且大部分都是分片的,据我了解像VLC这样的播放器是不支持分片的。所以你必须重新组装它们。 此过程仅适用于分段数据包类型(如 49)。你有一个额外的 header 是这样的:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E| FuType |
+---------------+
位 S 和 E 告诉您如何重组数据包。序列中的第一个数据包有 S,E = 1,0,其他数据包有 S,E = 0,0(可能是多个数据包),最后一个数据包有 S,E = 0,1。所有有效负载字节都被连接起来,然后通过将主 header 中的类型替换为此处提到的 FuType 来创建一个新的 header(不要忘记 4Byte header):
+---------------+---------------+--------------
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------
|F| FuType | LayerId | TID | all the concatenated payloads
+-------------+-----------------+---------------
请记住,您必须同时保留碎片化和非碎片化的有效载荷,因为大多数未碎片化的数据包都包含不可省略的重要信息,例如图片大小。基本流可以通过 SMplayer 播放,也可以使用 VLC。 对于 VLC,您必须将 demuxer 设置为 h265。