Quantcast
Channel: FFmpeg | ニコラボ
Viewing all articles
Browse latest Browse all 310

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

$
0
0

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

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

基本コマンド

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_filenameuse_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 を省略する
  • hls_playlist_type
    • event
      マニフェストに #EXT-X-PLAYLIST-TYPE:EVENT をつけ、hls_list_size 0 も強制される
    • vod
      マニフェストに #EXT-X-PLAYLIST-TYPE:VOD をつけ、hls_list_size 0 も強制される

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


Viewing all articles
Browse latest Browse all 310

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>