我正在尝试从 h.265 编码和未加密的 rtsp/rtp pcap 捕获中提取视频文件。我尝试提取 rtp 流原始数据并尝试使用 vlc 播放它但无法正常工作。有什么方法可以从 pcap 捕获中获取 h.265 视频文件。
1 回答
实际上,这是一件棘手的事情。http://ucsniff.sourceforge.net/videosnarf.html为 h264实现了类似的概念,但它们不支持 h265,所以我采用了该方法。主要思想是您必须添加一些缺少的部分。
正如https://www.rfc-editor.org/rfc/rfc7798中提到的,标题是这样的:
+---------------+---------------+
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F| Type | LayerId | TID |
+-------------+-----------------+
您必须为每个基本流数据包添加已删除的标头,即 4 字节 (00 00 00 01)。
但是我们都知道h265数据包太长而且大部分都是分片的,据我了解像VLC这样的播放器不支持分片。所以你必须重新组装它们。此过程仅适用于分段数据包类型(如 49)。您有一个额外的标题,如下所示:
+---------------+
|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。所有的有效载荷字节都被连接起来,然后通过用这里提到的 FuType 替换主标头中的类型来创建一个新的标头,如下所示(不要忘记 4Byte 标头):
+---------------+---------------+--------------
|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,您必须将解复用器设置为 h265。