在MPEG TS流中检测视频帧类型

5
我正在尝试提取TS分组中帧类型的信息。我使用FFMPEG发送MPEG TS封装视频(使用x264压缩),在另一端,我使用Wireshark记录接收到的数据包。我的数据包长度为188字节,对应一个MPEG TS数据包。现在我需要找出哪些TS数据包携带I、P或B帧的数据。
我尝试根据这篇文章检测图像头部(00 00 01 00):http://forum.digital-digest.com/f4/help-extract-i-frames-mpeg2-ts-89736.html,但是我没有找到它。我只能注册到PES包的开始(00 00 00 01 E0)。 我对格式感到非常困惑。PES的哪一部分可以表明一个TS数据包传输哪种帧类型?
谢谢。

你能使用ffprobe来做到这一点吗? - av501
在ts-packet中检测帧起始码并不是一件简单的事情。首先,起始码仿真可能会发生(例如,在PES头的私有数据部分)。此外,起始码可能会在两个ts-packet之间断开,例如“00 00”是第一个ts-packet的结尾,“01”是ts-packet数据的开始。 - Shevach Riabtsev
1
你可以尝试使用:https://github.com/tsduck/tsduck - Pierz
1个回答

9

只需以ts格式捕获所有内容,然后运行ffprobe。

使用命令 ffprobe -show_frames 并查找视频帧中的 pict_type。编写一个小脚本来解析输出并给出结果。如果您懒得这样做,

ffprobe -show_frames | grep pict_type | grep -n I
应该能直接给出帧数。

只要是有效的视频文件,就可以使用此方法。


忘了提到ffprobe是ffmpeg工具的一部分。 - av501
非常感谢您的回答。我已经尝试使用您建议的ffprobe(使用-show_frames选项),但它会给出每个帧的信息,而我需要有关每个数据包中存储哪种帧类型数据的信息。使用-show_packet选项也无法提供数据包中数据是I、P还是B帧类型的信息。 - stani
1
你可以将数据包与帧相关联。编写一个小脚本来为您完成这项工作!由于它是传输流,每个数据包的大小都是188字节。因此,从ffprobe中,您可以获取每个帧的帧大小。现在,您有一种直接关联两者的方法,因为您知道每个帧的大小,而数据包的大小为188。请记住,当没有帧数据时[帧在数据包结束之前结束],数据包会被填充到188字节,因此新帧始于新数据包。 - av501
我也尝试使用 MPEG2-TS Packet analyser 2.4.1.2(来源于 www.pjdaniel.org.uk/mpeg/),它可以读取 PES 头,但找不到图像头——显示:"Video sequence Sequence header code not found in this packet AFD not found in this packet"。那么解码器(或 ffprobe)如何知道每个数据包包含什么帧类型的数据? - stani
我明白了。这似乎是一种较为困难的方法,但是它是可行的。我想通过逐个读取数据包来完成它,因为之后我想尝试有意删除某些数据包并观察删除数据包对视频质量的影响。谢谢。 - stani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接