如果輸出指定為 .avi 文件,則剪切 .avi 檔案的一部分不準確(但如果輸出指定為 .mp4 文件,則準確)

如果輸出指定為 .avi 文件,則剪切 .avi 檔案的一部分不準確(但如果輸出指定為 .mp4 文件,則準確)

我正在嘗試剪掉一部分.avi使用命令檔案

ffmpeg -ss 346 -i input.avi -t 5 -c copy -y output.avi

輸出影片的總長度約為13秒,比所需的時間長了8秒。但是如果輸出檔案的副檔名指定為.mp4,則切割準確。我想了解為什麼會發生這種情況。

任何幫助表示讚賞。

答案1

AVI 和 MP4 是資料流的容器,MP4 的功能強大得多。

MP4 容器可讓您在非關鍵影格處從來源視訊串流建立準確的“剪切”,而無需重新編碼,方法是在內部使用編輯列表

例如,假設您想要從來源影片複製 346 秒至 351 秒(這就是您正在做的事情)。如果 346 秒之前最接近的關鍵幀位於 338 秒,則 ffmpeg 實際上會複製從 338 秒開始的視頻,但使用 MP4 的編輯列表魔法告訴媒體播放器跳過前 8 秒。

同樣的邏輯可能也適用於切口的末端(不確定,需要測試)。如果是這樣,編輯清單也會告訴媒體播放器提前停止播放。

AVI 不像 MP4 那樣支援編輯列表,這就是為什麼使用 AVI 容器您將看到完整的 13 秒剪輯。

我希望這是有道理的 - 如果您有疑問,請發表評論,我會盡力澄清。

編輯我創建了一個圖表來嘗試直觀地顯示 ffmpeg 正在做什麼:

當您不重新編碼時 ffmpeg 如何進行剪切

相關內容