通常の方法だと1エンコード1出力なのが、1エンコード複数出力できるteeマルチプレクサの使い方。

基本コマンド

出力するストリーム毎に -map を指定し、同じストリームを複数の出力するときは -map を省略する。-flags +global_header をつけた方が再生互換が高まる。ニコ生にはこれをつけないと映像が映らない。

同じ内容を2つに分けて出力する。
ffmpeg -i input.mp4 -c copy -map 0:v -map 0:a -flags +global_header -f tee "output1.mp4|output2.mp4"

ffmpeg -i input.mp4 \
-c copy -map 0:v -map 0:a -flags +global_header -f tee \
"output1.mp4|output2.mp4"

1出力目はフィルタを当ててエンコードし、2出力目はコピーする。
ffmpeg -i input.mp4 -filter:v:0 scale=-2:360 -c:v:0 libx264 -c:a:0 aac -b:a:0 64k -c:v:1 copy -c:a:1 copy -map 0:v -map 0:v -map 0:a -map 0:a -flags +global_header -f tee "[select=\'v:0,a:0\':movflags=+faststart]out1.mp4|[select=\'v:1,a:1\':movflags=+faststart]out2.mp4"

ffmpeg -i input.mp4 \
-filter:v:0 scale=-2:360 -c:v:0 libx264 -c:a:0 aac -b:a:0 64k \
-c:v:1 copy -c:a:1 copy \
-map 0:v -map 0:v -map 0:a -map 0:a -flags +global_header -f tee \
"[select=\'v:0,a:0\':movflags=+faststart]out1.mp4|\
 [select=\'v:1,a:1\':movflags=+faststart]out2.mp4"

映像は2種類にリサイズし、音声はエンコードしたのを2出力する。つまり音声は出力するストリームが1種類なので -map 0:a が1つだけになる。
ffmpeg -i input.mp4 -filter:v:0 scale=1280:-2 -c:v:0 libx264 -c:a:0 aac -b:a:0 64k -filter:v:1 scale=640:-2 -c:v:1 libx264 -map 0:v -map 0:v -map 0:a -flags +global_header -f tee "[select=\'v:0,a\':movflags=+faststart]out1.mp4|[select=\'v:1,a\':movflags=+faststart]out2.mp4"

ffmpeg -i input.mp4 \
-filter:v:0 scale=1280:-2 -c:v:0 libx264 -c:a:0 aac -b:a:0 64k \
-filter:v:1 scale=640:-2  -c:v:1 libx264 \
-map 0:v -map 0:v -map 0:a -flags +global_header -f tee \
"[select=\'v:0,a\':movflags=+faststart]out1.mp4|\
 [select=\'v:1,a\':movflags=+faststart]out2.mp4"

ビットストリームフィルタも使える。tee 外に指定すればすべての出力に指定される。
ffmpeg -i input.mp4 -c copy -map 0:v -map 0:a -bsf:v h264_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -flags +global_header -f tee "out1.mp4|out2.mp4"

ffmpeg -i input.mp4 \
-c copy -map 0:v -map 0:a \
-bsf:v h264_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 \
-color_primaries bt709 -color_trc bt709 -colorspace bt709 -flags +global_header -f tee \
"out1.mp4|out2.mp4"

ビットストリームフィルタを異なるエンコーダ、以下の例では libx264 と libx265、で指定するときには tee 内で個別に指定する。
ffmpeg -i input.mp4 -c:v:0 libx264 -c:a copy -c:v:1 libx265 -map 0:v -map 0:v -map 0:a -color_primaries bt709 -color_trc bt709 -colorspace bt709 -flags +global_header -f tee "[select=\'v:0,a\':bsfs/v=h264_metadata=colour_primaries=1:bsfs/v=h264_metadata=transfer_characteristics=1:bsfs/v=h264_metadata=matrix_coefficients=1:movflags=+faststart]out1.mp4|[select=\'v:1,a\':bsfs/v=hevc_metadata=colour_primaries=1:bsfs/v=hevc_metadata=transfer_characteristics=1:bsfs/v=hevc_metadata=matrix_coefficients=1:movflags=+faststart]out2.mp4"

ffmpeg -i input.mp4 \
-c:v:0 libx264 -c:a copy \
-c:v:1 libx265 -map 0:v -map 0:v -map 0:a \
-color_primaries bt709 -color_trc bt709 -colorspace bt709 -flags +global_header -f tee \
"[select=\'v:0,a\':bsfs/v=h264_metadata=colour_primaries=1:\
 bsfs/v=h264_metadata=transfer_characteristics=1:\
 bsfs/v=h264_metadata=matrix_coefficients=1:movflags=+faststart]out1.mp4|\
 [select=\'v:1,a\':bsfs/v=hevc_metadata=colour_primaries=1:\
 bsfs/v=hevc_metadata=transfer_characteristics=1:\
 bsfs/v=hevc_metadata=matrix_coefficients=1:movflags=+faststart]out2.mp4"

ビットストリームフィルタの指定例。
qsv 対応の ffmpeg をつくる | H.264
qsv 対応の ffmpeg をつくる | H.265
VP9(libvpx-vp9)のエンコード設定について | VP9

映像は3種類リサイズし、音声は2種類エンコードしたHLSのプレイリストを出力する例。
ffmpeg -i input.mp4 -filter:v:0 scale=1280:-2 -c:v:0 libx264 -c:a:0 aac -b:a:0 128k -filter:v:1 scale=640:-2 -c:v:1 libx264 -c:a:1 aac -b:a:1 96k -filter:v:2 scale=320:-2 -c:v:2 libx264 -map v:0 -map v:0 -map v:0 -map a:0 -map a:0 -flags +global_header -f tee "[select=\'v:0,a:0\':f=hls:start_number=0:hls_time=10:hls_list_size=0]high.m3u8|[select=\'v:1,a:1\':f=hls:start_number=0:hls_time=10:hls_list_size=0]medium.m3u8|[select=\'v:2,a:1\':f=hls:start_number=0:hls_time=10:hls_list_size=0]low.m3u8"

ffmpeg -i input.mp4 \
-filter:v:0 scale=1280:-2 -c:v:0 libx264 -c:a:0 aac -b:a:0 128k \
-filter:v:1 scale=640:-2  -c:v:1 libx264 -c:a:1 aac -b:a:1 96k \
-filter:v:2 scale=320:-2  -c:v:2 libx264 \
-map v:0 -map v:0 -map v:0 -map a:0 -map a:0 -flags +global_header -f tee \
"[select=\'v:0,a:0\':f=hls:start_number=0:hls_time=10:hls_list_size=0]high.m3u8|\
 [select=\'v:1,a:1\':f=hls:start_number=0:hls_time=10:hls_list_size=0]medium.m3u8|\
 [select=\'v:2,a:1\':f=hls:start_number=0:hls_time=10:hls_list_size=0]low.m3u8"

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

映像は3種類リサイズし、音声は1種類エンコードしたDASHのプレイリストを出力する例。
ffmpeg -i input -c:v libvpx-vp9 -quality realtime -speed 4 -keyint_min 120 -g 120 -filter:v:0 scale=1280:-2 -b:v:0 1000k -minrate 500k -maxrate 1500k -threads 3 -filter:v:1 scale=640:-2 -b:v:1 300k -minrate 150k -maxrate 400k -threads 2 -filter:v:2 scale=480:-2 -b:v:2 200k -minrate 100k -maxrate 300k -threads 1 -c:a libopus -b:a 128k -map 0:v -map 0:v -map 0:v -map 0:a -flags +global_header -f tee "[f=dash:seg_duration=4]output.mpd|[select=\'v:0,a:0\']out1.webm|[select=\'v:1,a:0\']out2.webm|[select=\'v:2,a:0\']out3.webm"

ffmpeg -i input \
-c:v libvpx-vp9 -quality realtime -speed 4 -keyint_min 120 -g 120 \
-filter:v:0 scale=1280:-2 -b:v:0 1000k -minrate 500k -maxrate 1500k -threads 3 \
-filter:v:1 scale=640:-2  -b:v:1 300k -minrate 150k -maxrate 400k -threads 2 \
-filter:v:2 scale=480:-2  -b:v:2 200k -minrate 100k -maxrate 300k -threads 1 \
-c:a libopus -b:a 128k -map 0:v -map 0:v -map 0:v -map 0:a -flags +global_header -f tee \
"[f=dash:seg_duration=4]output.mpd|\
 [select=\'v:0,a:0\']out1.webm|\
 [select=\'v:1,a:0\']out2.webm|\
 [select=\'v:2,a:0\']out3.webm"

ffmpeg で MPEG-DASH を扱う
VP9(libvpx-vp9)のエンコード設定について

YouTubeとニコニコ生放送に同時配信してそれぞれのデータを保存する。実際にライブ配信するときはハードウェアアクセレーションを使わないとCPU負荷がとても大きいので QSV, NVENC, VCE のどれかを使う。
ffmpeg -re -i input -c:v:0 libx264 -c:a aac -ar 44100 -b:a 196k -c:v:1 libx264 -filter:v:1 scale=1280:-2 -map 0:v -map 0:v -map 0:a -flags +global_header -f tee "[select=\'v:0,a\':f=flv:onfail=ignore]rtmp://a.rtmp.youtube.com/live2/xxx|[select=\'v:0,a\']youtube.flv|[select=\'v:1,a\':f=flv:onfail=ignore]rtmp://nlpoca306.live.nicovideo.jp/origin/rt2_nicolive/nicolive-production-xxx?rt2_nicolive=123456.xxx|[select=\'v:1,a\']nicolive.flv"

ffmpeg -re -i input \
-c:v:0 libx264 -c:a aac -ar 44100 -b:a 196k \
-c:v:1 libx264 -filter:v:1 scale=1280:-2 \
-map 0:v -map 0:v -map 0:a -flags +global_header -f tee \
"[select=\'v:0,a\':f=flv:onfail=ignore]rtmp://a.rtmp.youtube.com/live2/xxx|\
 [select=\'v:0,a\']youtube.flv|\ 
 [select=\'v:1,a\':f=flv:onfail=ignore]rtmp://nlpoca306.live.nicovideo.jp/origin/rt2_nicolive/nicolive-production-xxx?rt2_nicolive=123456.xxx|\
 [select=\'v:1,a\']nicolive.flv"

qsv 対応の ffmpeg をつくる
ffmpeg に nvenc(cuda)をインストールする
AMD VCE 対応の ffmpeg をつくる

公式ドキュメント:FFmpeg Formats Documentation : tee

オプション

tee 外で使われるオプション。

  • use_fifo[boolean]
    fifo を使うかどうか
    既定値:0
  • fifo_options[string]
    fifo pseudo-muxer で使われるオプション指定。key=value形式のコロン : でつなげる。

tee 内で使われるオプション。key=value形式のコロン : でつなげる。

  • f
    フォーマット指定
    例:f=hls
  • bsfs[/spec]
    ビットストリームフィルタの指定。opt=value形式のコロン : でつなげる。
    例:bsfs/v=h264_metadata=colour_primaries=1
  • use_fifo bool
    fifo を使うかどうか。tee 内で使い分けられる
    例:use_fifo=1
  • fifo_options
    fifo pseudo-muxer で使われるオプション指定。tee 内で使い分けられる
  • select
    ストリーム指定子を使ってどれを出力するかの指定。無指定だと -map で指定したすべてを出力する。, で区切る
    例:select=\’v:0,a:0\’
  • onfail
    出力に失敗したときの挙動の指定。abort は中断で既定値。ignore は続行
    例:onfail=abort

複数の出力先のときの挙動を調整する fifo

コメントを残す

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

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