使用 ffmpeg 精確切割視訊(+音訊)

使用 ffmpeg 精確切割視訊(+音訊)

我希望我的網站允許用戶根據我提供的來源影片準確地創建自己的剪輯。

我有一個來源視訊文件,我首先想將其轉換為適合網站的文件:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

我使用 ffmpeg 來轉換它,如下所示:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

回看這個視頻,它的質量足夠好,文件大小足夠小,可以滿足我的需求,並且可以在我的網站上加載/播放。

我有一個網頁,可讓用戶選擇該影片的起點和終點 - 並建立剪輯。這是我使用的 ffmpeg 命令的範例:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

問題是剪輯的時間並不總是足夠準確。通常音訊足夠準確,但影片會提前半秒停止或其他什麼情況。

有什麼方法可以使其準確且同步(例如 0.2 秒)嗎?

編輯:新增-force_key_frames 00:00:00.2沒有幫助。

編輯:我更改了剪輯以使用-c:v libx264 -c:a aac -strict experimental而不是-codec:v copy -codec:a copy獲得良好的(ish)結果。

該文件可以毫無問題地在外部播放 - 但是當我將其加載到我的 html5 視頻元素並播放時 - 視頻的最後部分(音頻很好)凍結。最後凍結的部分長度不到一秒。

我應該嘗試使用其他視訊編碼器嗎? libx264 的最佳替代方案是什麼?請記住,我可能希望將其發佈在公共網站上。

但等一下,它在 MPC 或 Windows Media Player 等播放器上準確播放且沒有問題的事實是否表明這是 Google Chrome 或 HTML 視訊元素的問題?或者我使用了不支援的編碼或其他什麼?

答案1

行為的-ss變化取決於它是否用作輸入或輸出選項,並且通常較慢,但用作輸出選項時可以更準確。看答案ffmpeg緩慢轉換指定時間段的視頻了解更多詳細資訊和範例。

若要變更輸出質量,請source.mp4使用-crf值介於 18-28 之間的選項(預設值為 23)。請參閱 CRF 部分FFmpeg 和 x264 編碼指南舉些例子。

您的修剪命令可以簡化:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

我替換-codec:v copy -codec:a copy-c copy -map 0.這將複製所有串流,而不僅僅是第一個視訊和音訊串流——儘管由於您先前的命令,輸入只有兩個串流。由於您無法在不重新編碼的情況下進行縮放,因此與 互斥-codec:v copy,並且由於您的輸入已經縮放到設定的大小,因此我刪除了過濾器選項。

如果仍然不夠準確,請嘗試:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

它會更慢,但可能更準確。請參閱我提供的第一個鏈接中答案中的鏈接,以了解這兩個示例的差異的描述。

最後,您應該運行source.mp4qt-faststart位於 ffmpeg 原始程式碼中的工具目錄中),或使用該-movflags faststart選項。這會將一些資料重新定位到檔案的開頭,以便在完全下載之前可以開始播放。

相關內容