通常の方法だと1エンコード1出力なのが、1エンコード複数出力できるteeマルチプレクサの使い方。
基本コマンド
出力するストリーム毎に-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 -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