ffmpeg流复制帧精度

ffmpeg流复制帧精度

我知道这可能是不可能的,但我至少希望了解发生了什么。

我有一个每 2 秒强制关键帧的视频。理想情况下,我希望能够获得帧完美的切片,而无需重新编码。例如:

ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...

这似乎不太管用。

深入研究后发现,第一片看起来是帧精确的,但之后的所有内容都有轻微的偏移(它可能存在其他问题,但我现在只关注这一点)。第一帧看起来没问题:

# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

但此后的一切均已关闭:

# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

无论我做什么,我都会得到相同的结果。如果我查看第 60 帧的原始 PTS,我会得到 2.002000(而不是 2)。但是,即使我将其用于我的切片,我也会得到相同的偏移量。

这是怎么回事?

(可能没有实现,但我也很好奇为什么 0_slices.mp4 的第一帧有一个偏移 PST/DST,即使原始帧没有)

答案1

如果您想要帧精确搜索,请尝试将您的-ss标志放在输入文件后面。

像这样:

ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png

在输入文件之前放置ss标志对于 PTS 来说只是“粗略猜测”,但必须捕捉到 I 帧才能起作用。这比在ss输入文件之后放置标志要快得多,但代价是准确性较低。

当您将ss标志放在输入文件之后时,FFmpeg 将从文件开头一直解码,直到-ss时间开始。然后它会转储时间之前的所有信息ss...因此它需要更长的时间,但它应该是准确的。

相关内容