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

ffmpeg で複数出力

基本コマンド

出力するストリーム毎に-mapを指定し、同じストリームを複数の出力するときは2番目以降の-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"

ビットストリームフィルタの指定例。
ビットストリームフィルタのまとめ

映像は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 -i input.mp4 -map 0:v -map 0:a -c copy -f tee "[select=\'v:0\':f=hls]video.m3u8|[select=\'a:0\':f=hls]audio.m3u8"

ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy -f tee \
"[select=\'v:0\':f=hls]video.m3u8|[select=\'a:0\':f=hls]audio.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 -hwaccel qsv -c:v h264_qsv -i input -filter_complex vpp_qsv=detail=50,split=3[v1][v2][v3];[v2]vpp_qsv=width=1280[v2o];[v3]vpp_qsv=width=800[v3o] -map "[v1]" -map "[v2o]" -map "[v3o]" -map "[0:a]" -c:v h264_qsv -c:a aac -b:a 96k -f tee -flags +global_header "[select=\'v:0,a\']output.mkv|[select=\'v:1,a\':f=flv:onfail=ignore]rtmp://a.rtmp.youtube.com/live2/xxx|[select=\'v:2,a\':movflags=+faststart]output.mp4"

How to encode audio once for multiple output videos with ffmpeg – Stack Overflow

「Could not write header for output file #0 (incorrect codec parameters ?)」のエラーが出るときは-tag:v, -vtag 7、「Tag mp4a incompatible with output codec id ‘86018’」のエラーには-tag:a 10, -atag 10をつける。

ffmpeg -i input -map 0 -c copy -tag:v 7 -tag:a 10 -f tee "[f=flv]rtmp://192.168.3.64:1935/main/stream0|[f=flv]rtmp://192.168.3.64:1935/main/stream1"

ffmpeg tee muxer failing with error: Tag avc1 incompatible with output codec id ’28’ – Stack Overflow

ライブ配信などで保存しながら映像を再生する。
ffmpeg -i input -map 0 -c copy -f tee "output.ts|[f=mpegts]pipe:" | ffplay pipe:

ubuntu – How to display and capture webcam stream at the same time? – Super User

ローカルに保存しながら2カ所にrtmpで配信する。
-i ... -f tee "[onfail=ignore]'C:\Users\blablabla.mp4'|[f=fifo:fifo_format=flv:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]"rtmp://yourServer..."|[f=fifo:fifo_format=flv:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]"rtmp://facebook..."

FFMPEG: How to stream to multiple outputs with the same encoding independently – Stack Overflow
audio – FFmpeg: tee muxer fails on multiple outputs HLS and .mp4 – Super User

ffmpegのwiki:Creating multiple outputs – FFmpeg
公式ドキュメント:FFmpeg Formats Documentation : tee

オプション

fifo pseudo-muxerのオプション:
複数の出力先のときの挙動を調整する fifo

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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