检测 mp4 容器中的 H.264 帧类型

Detect H.264 frame type in an mp4 container

假设 H.264 编码的视频流存储在 mp4 容器中。检测帧类型并将它们与部分存储数据相关联的直接方法是什么?

我可以使用以下命令提取帧类型。我想将它们与特定的数据段(例如字节 X 到字节 Y)相关联,以便我可以对 I、P 和 B 帧应用不同数量的噪声。目前,我正在使用一个简单的 Python 脚本以固定错误率翻转存储数据中的随机位,而不管帧类型如何。

ffprobe -show_frames <filename>.mp4

我后来发现,识别每个 I 帧字节的一种方法是使用 ffprobe 以及 pkt_pospkt_size 参数。第一个代表观察到的帧的第一个字节,而它们的总和减一就是帧的最后一个字节。在 Python 中,然后使用

提取帧的字节
with open(f'{name_root}.{name_extension}', 'rb') as f:
    data = list(f.read())
frame = data[pkt_pos:pkt_pos+pkt_size]

处理多帧会使事情变得更加复杂。下面将显示所有I帧的位置

ffprobe -show_frames <filename>.mp4 | grep "=I" -B 18 -A 11 | grep "pkt_pos"

我决定将输出复制到 CSV,然后在 Python 中打开它。

注意,上面的pkt_pos可以用pkt_size或任何其他参数代替。