ffmpeg で Apple HTTP Live Streaming(通称、HLS)形式に出力する方法。各セグメントの動画ファイルは .ts でプレイリストとなるマニフェストは .m3u8 で出力される。また segment
muxer のオプションを使うことでより詳細な設定ができる。
基本コマンド
ffmpeg -i input output.m3u8
.mp4 を HLS にコーデックコピーする例
ffmpeg -i input.mp4 -bsf:v h264_mp4toannexb -c copy output.m3u8
.mp4 から暗号化とセグメントの時間指定(60秒)をする例(file.keyinfo は後述)
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_key_info_file file.keyinfo -hls_list_size 0 -hls_time 60 output.m3u8
公式ドキュメント:FFmpeg Formats Documentation :: hls
オプション
- hls_time seconds
各セグメントの秒
範囲:0 – FLT_MAX[float]
規定値:2 - hls_list_size size
マニフェストに記載されるセグメント数。0 はすべて
範囲:0 – INT_MAX[int]
規定値:5 - hls_ts_options options_list
- hls_vtt_options options_list
- hls_subtitle_path path
字幕ファイルのパス指定
規定値:なし[string] - hls_wrap wrap
セグメント数の上限を指定する。上限に達すると最初のセグメントから上書きするので容量の削減になる
範囲:0 – INT_MAX[int]
規定値:0 - start_number number
セグメントの開始番号。開始番号を変更するのであり、映像の開始をずらすのではない
範囲:0 – I64_MAX[int64]
規定値:0 - hls_allow_cache allowcache
キャッシュを許可するかどうかを明示的に指定する
1 は許可する、0 は許可しない
範囲:-1 – 1[int]
規定値:-1 - hls_base_url baseurl
各セグメントに URL を付与する。各セグメントに絶対パスを指定するときに使う
規定値:なし[string] - hls_segment_filename filename
各セグメントのファイル名を指定する。マニフェスト出力の前に指定する。指定しなければマニフェストファイル名に連番が振られる。Windows 環境ではdrawtext
の時と同じように%s
が使えず、組み合わせによってもエラーになる
Windows の ffmpeg で生放送する方法 : drawtext(テキスト描写)
例:file%03d.ts(file000.ts, file001.ts, file002.ts, …)
規定値:なし[string] - use_localtime
セグメントのファイル名に strftime を割り当てる。hls_segment_filename
、use_localtime_mkdir
で使う
例:-use_localtime 1 -hls_segment_filename %Y%m%d.ts(20160420.ts)
規定値:0[boolean] - use_localtime_mkdir
セグメントの末端のディレクトリ指定に strftime を割り当てる。hls_segment_filename
を併用する。ディレクトリがなければつくる
例:-use_localtime 1 -use_localtime_mkdir 1 -hls_segment_filename “%Y%m%d/%Y%m%d.ts”(20160420/20160420.ts)
規定値:0[boolean] - hls_key_info_file key_info_file
セグメントの暗号化で使うファイルを指定する。key には 32バイトのバイナリを、IV には 16進数の文字列を指定する。書式は後述
規定値:なし[string] - hls_flags
- single_file
1つだけのセグメントで出力 - delete_segments
マニフェストに記載されていないセグメントを順番に削除していく。hls_list_size 0
を併用すると効果が無い - round_durations
マニフェストに記載されている1秒未満の時間を四捨五入する - discont_start
- omit_endlist
マニフェストの末端に追記される#EXT-X-ENDLIST
を省略する
- single_file
- hls_playlist_type
- event
マニフェストに#EXT-X-PLAYLIST-TYPE:EVENT
をつけ、hls_list_size 0
も強制される - vod
マニフェストに#EXT-X-PLAYLIST-TYPE:VOD
をつけ、hls_list_size 0
も強制される
- event
hls_key_info_file の書式
書式
key URI key file path IV (optional)
例
http://server/file.key /path/to/file.key 0123456789ABCDEF0123456789ABCDEF
file.key を openssl で作って暗号化するシェルスクリプト
#!/bin/sh BASE_URL=${1:-'.'} openssl rand 16 > file.key echo $BASE_URL/file.key > file.keyinfo echo file.key >> file.keyinfo echo $(openssl rand -hex 16) >> file.keyinfo ffmpeg -f lavfi -i testsrc -t 10 -c:v h264 -vf format=yuv420p -hls_key_info_file file.keyinfo output.m3u8
上のシェルスクリプトで作られる file.keyinfo の例
./file.key file.key ab160b11e8ec73708cfa8797d729c378
openssl で復号する例
openssl aes-128-cbc -d -in input.ts -out output.ts -K A4856CAC48F1E48D16688FEDE9925265 -iv 0123456789ABCDEF0123456789ABCDEF