segment
muxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名には image2
muxer と同じように連番出力や、strftime
オプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hls
muxer のオプションと併用することで詳細に分割設定ができる
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法
基本コマンド
60秒ごとに .mp4 で分割して out.csv で分割データを記載したファイルも出力する
ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 60 -segment_list out.csv out%03d.mp4
時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める
ffmpeg -i input.mp4 -force_key_frames 1,2,3,5,8,13,21 -map 0 -c:v libx264 -c:a aac -f segment -segment_time 60 -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 -segment_list out.csv out%03d.mp4
公式ドキュメント:FFmpeg Formats Documentation :: segment, stream_segment, ssegment
オプション
- increment_tc 1|0
各セグメント間のタイムコードを増やす
規定値:0[boolean] - reference_stream specifier
どのストリームを参照するか
規定値:auto[string] - segment_format format
セグメントのコンテナフォーマット指定
規定値:出力コンテナフォーマットと同じ - segment_format_options options_list
- segment_list name
出力されるセグメントリストのファイル名の指定
規定値:出力しない[string] - segment_list_flags flags
- cache
キャッシュを許可。M3U8 リストだけに反映(規定値) - live
HLS 配信に有効
- cache
- segment_list_size size
リストに記載されるセグメント数。0 はすべて
範囲:0 – INT_MAX[int] - segment_list_entry_prefix prefix
リストの各セグメントに URL を付与する。各セグメントに絶対パスを指定するときに使う
規定値:なし[string] - segment_list_type type
セグメントリストのファイル形式の指定- flat
普通のテキスト形式 - csv
- ext
- ffconcat
- m3u8
- hls
- flat
- segment_time time
各セグメントの秒指定。キーフレームでないと指定した時間通りに分割されない
規定値:2[string] - segment_atclocktime 1|0
1 で 00:00 開始の時計の時間通りに分割する。segment_time
で分割時間を指定する
規定値:0[boolean] - segment_clocktime_offset duration
segment_atclocktime
を使ったときに分割時間を遅延させる。例えば-segment_time 900 -segment_clocktime_offset 300
を併用すると 600秒、1500秒、2400秒と900秒毎に分割される
規定値:0[duration] - segment_clocktime_wrap_duration duration
規定値:INT64_MAX[int] - segment_time_delta delta
各セグメントの開始時間を決める時間(PTS)を特定する
規定値:0[duration] - segment_times times
,
で区切って分割時間を指定する。3分より長いストリームを用いて 60,120,180 を指定すると、60, 60, 60, 残り時間全部で分割される
規定値:0[string] - segment_frames frames
,
で区切って分割フレーム数を指定する。segment_times
と同様に分割タイミングが来たときにキーフレームが来ていなければ次のキーフレームで分割する
規定値:0[string] - segment_wrap limit
セグメント数の上限を指定する。上限に達すると最初のセグメントから上書きするので容量の削減になる
範囲:0 – INT_MAX[int]
規定値:0 - segment_start_number number
セグメントの開始番号。開始番号を変更するのであり、映像の開始をずらすのではない
範囲:0 – I64_MAX[int64]
規定値:0 - strftime 1|0
各セグメント名にstrftime
を使う。1 にしたときは必ずセグメント名にstrftime
の書式を用いなければならない
規定値:0[boolean] - break_non_keyframes 1|0
1 にしたときにセグメントの開始にキーフレーム以外も含める。特定のプレイヤーで挙動がよくなるかもしれないが一般的にはよくならない
規定値:0[boolean] - reset_timestamps 1|0
タイムスタンプをリセットして各セグメントのタイムスタンプが 0 になる。hls など分割を前提に読み込む以外はリセットした方が分割後のファイルが扱いやすい
規定値:0[boolean] - initial_offset offset
タイムスタンプのオフセット秒指定
規定値:0[duration] - write_empty_segments 1|0
各セグメントで空データが出力された場合にそのまま出力するか
規定値:0[boolean]