segment
muxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名にはimage2
muxer と同じように連番出力(%d)や、-strftimeオプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hls
muxer のオプションと併用することで詳細に分割設定ができる。
-reset_timestamps 1を付けると2分割以降のファイルの PTS がリセットされて動画投稿サイト向けに分割したファイルの投稿が可能になる。
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法
フィルタ内で分割するなら。
詳細な分割設定ができる Segment
基本コマンド
300秒毎にMP4に分割出力する。-flags +global_headerをつけると一部プレイヤーでの再生互換が高まる。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 300 -segment_format_options movflags=+faststart -reset_timestamps 1 out-%02d.mp4
-segment_time 60で60秒ごとにMP4で分割し-segment_list out.csvで分割データを記載したファイルも出力する。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 60 -segment_list out.csv -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
-segment_list out.ffconcatで分割したファイルをまとめたリストを出力する。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 60 -segment_list out.ffconcat -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
上のout.ffconcatを読み込んで1つのファイルに戻す。
ffmpeg -i out.ffconcat -c copy -segment_format_options movflags=+faststart output.mp4
-segment_timesで1032, 11414, 11847 の秒時間になったら分割する。つまり4分割される。-reset_timestampsを有効にすると分割ファイル毎の PTS が0秒開始になる。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_times 1032,11414,11847 -segment_format_options movflags=+faststart -reset_timestamps 1 out-%02d.mp4
-segment_wrap 100で常に最新の100フレームの画像を出力し、それ以外を削除する。
ffmpeg -i input -q:v 3 -f segment -segment_format mjpeg -segment_wrap 100 -segment_time 0.001 out%d.jpg
再エンコードして常にセグメントを固定秒にするにはキーフレーム間隔を強制する。-sc_threshold 0でシーンチェンジによるキーフレーム挿入を0にして、5秒間隔で分割するには-gのkeyintと-force_key_framesでキーフレーム間隔を固定させている。映像は30fpsとして5秒間の150フレームを-gで指定している。
ffmpeg -i input -c:v libx264 -crf 23 -c:a aac -map 0 -segment_time 5 -g 150 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*5)" -f segment output%03d.ts
-force_key_framesは2重引用符で挟むのと、カンマの後をバックスラッシュでエスケープしない。これらはエラーになる。
-force_key_frames 'expr:gte(n,n_forced*60)'
-force_key_frames "expr:gte(n\,n_forced*60)"
-force_key_frames expr:gte(n\,n_forced*60)
秒時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める。
ffmpeg -i input.mp4 -force_key_frames 1,2,3,5,8,13,21 -map 0 -c:v libx264 -c:a aac -flags +global_header -f segment -segment_time 60 -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
そのほかにカンマ区切りのhh:mm:ss.ms指定ができる。-force_key_frames 00:02:11.000,00:01:11.000
-segment_timeであらかじめ大きな値を指定していれば、1ファイルでも strftime書式が使える。使えるフォーマットは、ffmpeg で Apple HTTP Live Streaming(HLS)を扱う | セグメントファイル名の設定を参照。
ffmpeg -i input -map 0 -c c:v libx264 -c:a aac -f segment -segment_time 99999 -strftime 1 "output-%Y%m%d.ts"
ffmpeg Documentation : force_key_frames
linux – Slicing video file into several segments – Super User
最初のフレームから分割できないときは入力ファイルの前に-ignore_editlist 1をつける
ffmpeg -ignore_editlist 1 -i input.mp4 以下略
The video track has an edit list specifying a truncated track
公式ドキュメント:FFmpeg Formats Documentation : segment, stream_segment, ssegment
Continue reading “詳細な分割設定ができる Segment”