タグ別アーカイブ: muxer

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

ffmpeg で Apple HTTP Live Streaming(通称、HLS)形式に出力する方法。各セグメントの動画ファイルは .ts でプレイリストとなるマニフェストは .m3u8 で出力される。また segment muxer のオプションを使うことでより詳細な設定ができる。

詳細な分割設定ができる Segment

HTTP Live Streaming (HLS) – Apple Developer
(PDF) Apple の HTTPライブストリーミングの概要(日本語)
HLS の公式ドキュメント:draft-pantos-http-live-streaming – HTTP Live Streaming

基本コマンド

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

一般的な配信用の HLS 出力コマンド例
ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts

セグメントを出力して連結した動画も出力するコマンド例は4通りある

Creating multiple outputs – trac.ffmpeg.org

  1. セグメントと連結した動画の2種類エンコードする。つまり負荷も2倍
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb output.ts
  2. 上の2種類エンコードせずに、udp などにエンコードした映像を流して再度 ffmpeg で -c copy で取り込みセグメントと連結した動画の2種類を出力する
    ffmpeg -re -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f mpegts "udp://localhost:8080"
    ffmpeg -i "udp://localhost:8080" -c copy -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 -c copy output_%04d.ts -c copy output.ts -y
  3. すべてのセグメントを書き込むように設定し、ffmpeg でマニフェストを読み込み -c copy で連結する
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -hls_list_size 0 -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts
    ffmpeg -i "output.m3u8" -c copy output.ts
  4. tee muxer を使って1度のエンコードで2出力する
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -hls_list_size 0 -segment_format mpegts -segment_time 10 -segment_list output.m3u8 -f tee -map 0:v -map 0:a "[f=hls]output.m3u8|output.ts"

公式ドキュメント:FFmpeg Formats Documentation : hls
続きを読む ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

詳細な分割設定ができる Segment

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
続きを読む 詳細な分割設定ができる Segment