我知道這可能是不可能的,但我至少希望了解正在發生的事情。
我有一個視頻,每 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
...因此需要更長的時間,但它應該是準確的。