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

基本コマンド

出力するストリーム毎に-mapを指定し、同じストリームを複数の出力するときは-mapを省略する。-map 0:v-map v:0の違いは0が最初につくと1番目に入力した映像を指定し、vが先に来るとこれは最初の0が省略されて、1番目のファイルの映像の1番目だけを指定している。

-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

コメントを残す

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

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