質問: サンプルでraspividで取得した動画をffmpegでエンコードするスクリプトファイルがあってそれをいじってるんですが、ffmpegのオプションみたいに書かれているsegmentの使い方が全く分からないです。それの使い方を説明しているサイトがなかなか見つからなくて困っています。 プログラムはこれです。 ``` #!/bin/bash base="/data/live" cd $base raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -o - \ | ffmpeg -y \ -i - \ -c:v copy \ -map 0:0 \ -f ssegment \ -segment_time 4 \ -segment_format mpegts \ -segment_list "$base/stream.m3u8" \ -segment_list_size 720 \ -segment_list_flags live \ -segment_list_type m3u8 \ "segments/%08d.ts" trap "rm stream.m3u8 segments/*.ts" EXIT # vim:ts=2:sw=2:sts=2:et:ft=sh ``` スクリプトファイルを見るのもこれが初めてで少しは分かるんですが、segmentだけよく分かりません。どなたか使い方など教えて欲しいです。 よろしくお願いします。
回答: 掲示スクリプトのFFmpegでは、HTTP Live Streaming形式(通称HLS)のライブ・ストリーミング用ファイル出力を行っています。 `segment`または`ssegment`オプション指定では、動画像データを"セグメント"と呼ばれる単位に時分割し、それらを複数のファイルに出力します。掲示スクリプトでは`-segment_time 4`を指定していますから、セグメント長は 4秒 で分割されます。また末尾の`"segments/%08d.ts"`により、出力セグメントファイル名を指定しています。(`segments/00000000.ts`, `segments/00000001.ts`, `segments/00000002.ts`...が出力される。) `segment`と`ssegment`(正式名`stream_segment`)は名前が似ていますが、前者はグローバルヘッダを要求する出力フォーマット、後者は不要な出力フォーマットという違いがあります。掲示スクリプトでは`-segment_format mpegts`を指定しており、セグメントの出力フォーマットをMPEG-2 TSとしていますから、グローバルヘッダ不要の`ssegment`を使っています。