直接分割 (不重新編碼):
ffmpeg -ss 開始時間碼 -i 輸入檔 -to 結束時間碼 -c copy 輸出檔ffmpeg -ss 00:02:03.311 -i input.mp4 -to 00:02:36.914 -c copy output.mp4
ffmpeg 並不會自動把時間點改到最近的 IDR 影格,所以指定的時間點若不是 IDR 則會發生播放問題,要避免此問題必須重新編碼影片。
分割並重新編碼:
ffmpeg -ss 開始時間碼 -i 輸入檔 -to 結束時間碼 -c:v libx264 -refs:v 4 -bf:v 5 -crf:v 18 -c:a libfdk_aac -vbr:a 4 輸出檔分割並重新編碼 (無損輸出):
ffmpeg -ss 開始時間碼 -i 輸入檔 -to 結束時間碼 -c:v libx264 -refs:v 4 -bf:v 5 -qp:v 0 -c:a libfdk_aac -vbr:a 4 輸出檔無損的檔案大小是 CRF 18 的數倍,但視覺上的差異並不大。
無損合併:
用 ffmpeg 合併影片比較麻煩,這邊以 mp4box 為例mp4box -new 輸出檔 -add 輸入檔1 -add 輸入檔2
實例:
如果你要將一影片 Sample.mkv 分割為兩片段:cut1: 00:02:03.311 - 00:02:36.914
cut2: 00:03:25.240 - 00:03:56.512
然後合併它們
你可以這麼做:
ffmpeg -ss 00:02:03.311 -i Sample.mkv -to 00:02:36.914 -c:v libx264 -refs:v 4 -bf:v 5 -crf:v 18 -c:a libfdk_aac -vbr:a 4 cut1.mp4
ffmpeg -ss 00:03:25.240 -i Sample.mkv -to 00:03:56.512 -c:v libx264 -refs:v 4 -bf:v 5 -crf:v 18 -c:a libfdk_aac -vbr:a 4 cut2.mp4
mp4box -new output.mp4 -add cut1.mp4 -add cut2.mp4
背景知識:
影片是由連續數個影格(frames)所組成但為了節省資料量,並不是每一張影格都是完整的畫面
在播放時,那些影格必須要參考其他影格才能解碼出完整的畫面
而 IDR frame 也就是 keyframe
它是一張完整的影格 (I-frame),不需要參考其他影格就能解碼出完整的畫面
而其他影格 (例如 P-frames) 不會越過它去參考其它影格
所以你如果直接分割 (不重新編碼視訊)
你必須取 IDR 影格做為分割點
否則,分割片段的開頭或結尾的某些影格可能會找不到參考影格
導致播放問題 (破圖)
但問題是 IDR 影格的時間點不一定是你想要的
如果你想取準確地分割時間與避免播放問題
你只能重新轉換視訊來輸出新的 GOP
如果你需要重新轉換視訊
目前壓縮率最高且已普及的視訊編碼格式為 H.264 又名 AVC
H.264 可以達到無損,不過檔案太大,所以一般都是用有損
如果你編碼設定得當可以達到極低損失與不會太大的檔案
在 x264 編碼器上
通常只要用 CRF 18 即可達到很低損失
如果你要無損視訊輸出你必須使用 QP 0
引用自:https://www.mobile01.com/topicdetail.php?f=510&t=4246163