检测 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_pos
和 pkt_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
或任何其他参数代替。
假设 H.264 编码的视频流存储在 mp4 容器中。检测帧类型并将它们与部分存储数据相关联的直接方法是什么?
我可以使用以下命令提取帧类型。我想将它们与特定的数据段(例如字节 X 到字节 Y)相关联,以便我可以对 I、P 和 B 帧应用不同数量的噪声。目前,我正在使用一个简单的 Python 脚本以固定错误率翻转存储数据中的随机位,而不管帧类型如何。
ffprobe -show_frames <filename>.mp4
我后来发现,识别每个 I 帧字节的一种方法是使用 ffprobe
以及 pkt_pos
和 pkt_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
或任何其他参数代替。