用ffmpeg將MP4檔案分段


分割MP4檔案

ffmpeg -i video.mp4  -c copy -f segment \
 -segment_start_number 1 -segment_time 00:00:20 \
 -individual_header_trailer 1 -break_non_keyframes 1 -reset_timestamps 1 \
 -segment_format mov 'out_%03d.mp4'

-segment_start_number 1 是指定起始檔案為out_001.mp4
-segment_time 指定依照20秒分割一個檔案
-break_non_keyframes 1 是強制分割在時間點上,設定後才時間才會比較準,不然可能會一個14秒,一個26秒
-individual_header_trailer 1和-reset_timestamps 1是避免分割後的各個檔案無法個別用播放器查看所設定的

如果是做像行車紀錄器那種只會紀錄100個檔案

加入-segment_wrap即可!
ffmpeg -i video.mp4  -c copy -f segment \
 -segment_start_number 1 -segment_time 00:00:20 -segment_wrap 5 \
 -individual_header_trailer 1 -break_non_keyframes 1 -reset_timestamps 1 \
 -segment_format mov 'out_%03d.mp4'

不過這裡要注意產生的檔案名稱會是數到5之後就回歸零
結果是 ...,out_004.mp4, out_005.mp4, out_000.mp4, out_001.mp4, ....

網路串流依照時間分檔案並存下來

ffmpeg -i udp://224.0.0.1:14578 -c copy -f segment \
 -segment_time 00:00:20 \
 -individual_header_trailer 1 -break_non_keyframes 1 -reset_timestamps 1 \
 -segment_format mov -strftime 1 'out_%Y-%m-%d_%H:%M:%S.mp4'

-segment_time 指定依照20秒分割一個檔案
-strftime檔案名稱編碼會套用時間,這時候檔案名稱才能用%Y(年份)%m(月份)%H(小時)這些參數

這個方法也可套用在抓取webcam的串流,這樣就可以從檔名看時間。
這個方法要注意輸入檔案的來源,如果是電腦上的檔案, 會因為處理太快, 不到給秒就處理完分割, 導致輸出檔案缺漏。

例如我只切20秒, 處理時間不到1秒就完成,所以ffmpeg會輸出到同一個檔案, 
第一個片段out_2020-02-05-14:25:40.mp4,
第二個片段out_2020-02-05-14:25:40.mp4,
第三個片段out_2020-02-05-14:25:41.mp4,
第四個片段out_2020-02-05-14:25:41.mp4,
第五個片段out_2020-02-05-14:25:42.mp4,
然後結果因為處理時間的關係檔名重疊,導致最後只有3個檔案:out_2020-02-05-14:25:40.mp4, out_2020-02-05-14:25:41.mp4, out_2020-02-05-14:25:42.mp4


留言