segment muxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名には image2 muxer と同じように連番出力(%d)や、-strftime オプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hls muxer のオプションと併用することで詳細に分割設定ができる。

-reset_timestamps 1 を付けると2分割以降のファイルの PTS がリセットされて動画投稿サイト向けに分割したファイルの投稿が可能になる。

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法

基本コマンド

300秒毎にMP4に分割出力する。-flags +global_header をつけると一部プレイヤーでの再生互換が高まる。
ffmpeg -i input.mp4 -c copy -map 0 -flags +global_header -f segment -segment_time 300 -segment_format_options movflags=+faststart -reset_timestamps 1 out-%02d.mp4

60秒ごとにMP4で分割して out.csv で分割データを記載したファイルも出力する。
ffmpeg -i input.mp4 -c copy -map 0 -flags +global_header -f segment -segment_time 60 -segment_list out.csv -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4

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

常に最新の100フレームの画像を出力し、それ以外は削除される。
ffmpeg -i input -q:v 3 -f segment -segment_format mjpeg -segment_wrap 100 -segment_time 0.001 out%d.jpg

再エンコードして常にセグメントを固定秒にするにはキーフレーム間隔を強制する。9秒間隔で分割するには -g の keyint と -force_key_frames でキーフレーム間隔を固定させている。
ffmpeg -i input -c:v libx264 -crf 23 -c:a aac -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.ts

時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める。
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_list out.csv -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4

ffmpeg Documentation : force_key_frames
linux – Slicing video file into several segments – Super User

公式ドキュメント:FFmpeg Formats Documentation : segment, stream_segment, ssegment

オプション

ヘルプコマンド ffmpeg -h muxer=segment

  • -reference_stream [string]
    どのストリームを参照するか
    既定値:auto
  • -segment_format [string]
    セグメントのコンテナフォーマット指定。コンテナフォーマットと異なる場合、例えば Motion JPEG は -segment_format mjpeg の出力拡張子は jpg を指定する
    既定値:出力コンテナフォーマットと同じ
  • -segment_format_options [string]
    フォーマットオプションの指定。MP4出力のときには-segment_format_options movflags=+faststart をつける。FFmpeg Formats Documentation : mov, mp4, ismv を参照
  • -segment_list [string]
    出力されるセグメントリストのファイル名の指定
    既定値:出力しない
  • -segment_header_filename [string]
    ヘッダに1つのファイルを書き込む
  • -segment_list_flags [flags]
    • cache
      キャッシュを許可。M3U8 リストだけに反映。既定値
    • live
      HLS 配信に有効
  • -segment_list_size [int]
    リストに記載されるセグメント数。0 はすべて
    範囲:0 – INT_MAX
  • -segment_list_type [int] セグメントリストのファイル形式の指定
    • -1, flat
      普通のテキスト形式。既定値
    • 0, csv
    • 1, ext
    • 2, ffconcat
    • 3, m3u8
    • 4, hls
  • -segment_atclocktime [boolean]
    1 で 00:00 開始の時計の時間通りに分割する。-segment_time で分割時間を指定する
    既定値:0
  • -segment_clocktime_offset [duration]
    -segment_atclocktime を使ったときに分割時間を遅延させる。例えば -segment_time 900 -segment_clocktime_offset 300 を併用すると 600秒、1500秒、2400秒と900秒毎に分割される
    既定値:0
  • -segment_clocktime_wrap_duration [duration]
    set segment clocktime wrapping duration
    既定値:INT64_MAX
  • -segment_time [string]
    各セグメントの秒指定。キーフレームでないと指定した時間通りに分割されない。Apple の推奨値は 10。映像のキーフレーム間隔を元に設定する
    既定値:2
  • -segment_time_delta [duration]
    各セグメントの開始時間を決める時間(PTS)を特定する
    既定値:0
  • -segment_times [string]
    , で区切って分割時間を指定する。3分より長いストリームを用いて 60,120,180 を指定すると、60秒、60秒、60秒、残り時間全部で分割される
    既定値:0
  • -segment_frames [string]
    , で区切って分割フレーム数を指定する。-segment_times と同様に分割タイミングが来たときにキーフレームが来ていなければ次のキーフレームで分割する
    既定値:0
  • -segment_wrap [int]
    セグメント数の上限を指定する。上限に達すると最初のセグメントから上書きするので容量の削減になる
    範囲:0 から INT_MAX まで
    既定値:0
  • -segment_list_entry_prefix [string]
    リストの各セグメントに URL を付与する。各セグメントに絶対パスを指定するときに使う
    既定値:なし
  • -segment_start_number [int]
    セグメントの開始番号。開始番号を変更するのであり、映像の開始をずらすのではない
    範囲:0 から I64_MAX まで
    既定値:0
  • -segment_wrap_number [int]
    範囲:0 から I64_MAX まで
    既定値:0
  • -strftime [boolean]
    各セグメント名に strftime を使う。1 にしたときは必ずセグメント名に strftime の書式(%Y%m%d%H%M%S)を用いなければならない
    既定値:0
  • -increment_tc [boolean]
    各セグメント間のタイムコードを増やす
    既定値:0
  • -break_non_keyframes [boolean]
    1 にしたときにセグメントの開始にキーフレーム以外も含める。特定のプレイヤーで挙動がよくなるかもしれないが一般的にはよくならない
    既定値:0
  • -individual_header_trailer [boolean]
    各セグメントにヘッダ、トレイラを書き込む
    既定値:1
  • -write_header_trailer [boolean]
    セグメントの冒頭にヘッダを、末尾にトレイラを書き込む
    既定値:1
  • -reset_timestamps [boolean]
    タイムスタンプをリセットして各セグメントのタイムスタンプが 0 になる。HLS など分割を前提に読み込む以外はリセットした方が分割後のファイルが扱いやすい。ただし一部のコーデックやフォーマットでは使えない
    既定値:0
  • -initial_offset [duration]
    タイムスタンプのオフセット秒指定
    既定値:0
  • -write_empty_segments [boolean]
    各セグメントで空データが出力された場合にそのまま出力するか
    既定値:0

追記
オプションと順番の並び替え。2017年2月12日
画像出力のコマンド例。2018年5月24日
再エンコードでセグメント間隔とキーフレーム間隔指定の例。2019年8月3日
オプションの説明を一部詳しくした。2019年8月19日

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)