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

就 PTS 而言,將標誌放在ss輸入檔案之前將是一個“粗略猜測”,但必須捕捉到 I 幀才能工作。它比將標誌放在輸入檔案後面要快得多ss,但代價是不太準確。

當您將ss標誌放在輸入檔案後面時,FFmpeg 將從檔案開頭一直解碼,直到您的-ss時間開始。然後它會轉儲該時間之前的所有資訊ss...因此需要更長的時間,但它應該是準確的。

相關內容