1つのファイルにフィルタを使い分けたり、コピーしたり複数出力する方法のまとめ。ファイルからネットワーク越しに配信するときに「Past duration too large」のログが大量に発生するときは、-vsync passthrough -frame_drop_threshold 4を入力ファイルの後ろに指定する。

普通のコマンド。1入力を2度エンコードを行い2出力する。つまり負荷も2倍。コーデックやフィルタ指定してその後ろに出力ファイルの指定があるときは指定子はなくてもよい。
ffmpeg -i input.mp4 -movflags +faststart -c:v libx264 -c:a copy output1.mp4 -c:v libvpx-vp9 -c:a libopus output2.webm
ffmpeg -i input.mp4 -movflags +faststart -c:v:0 libx264 -c:a:0 copy output1.mp4 -c:v:1 libvpx-vp9 -c:a:1 libopus output2.webm

1入力で複数コピー出力するコマンド。
ffmpeg -i input.mp4 -c copy -movflags +faststart output1.mp4 -c copy -movflags +faststart output2.mp4
ffmpeg -i input.mp4 -c copy -map 0:v -map 0:a -movflags +faststart -flags +global_header -f tee "output1.mp4|output2.mp4"

フィルタを当てて同じ内容を2出力する。このコマンドだと映像、音声2つずつの4つのストリームがエンコードになる。
ffmpeg -i input.mp4 -filter_complex scale=-2:360,split[0v][1v] -map [0v] -map 0:a -map [1v] -map 0:a -c:v:0 libx264 -c:a:0 aac -flags +global_header output1.mp4 -c:v:1 libx264 -c:a:1 aac -flags +global_header output2.mp4

teeを使えばフィルタを使っても1つの再エンコードで2カ所以上に出力できる。
ffmpeg -i input.mp4 -filter_complex scale=-2:360 -vcodec libx264 -acodec copy -map 0:v -map 0:a -flags +global_header -f tee "output1.mp4|output2.mp4"

フィルタを当ててエンコードとコピーの2出力にする。
ffmpeg -i input.mp4 -filter_complex scale=-2:360 -vcodec libx264 -acodec copy -movflags +faststart -flags +global_header output1.mp4 -c copy -movflags +faststart -flags +global_header output2.mp4

フィルタを当てて音声エンコード設定も変える。
ffmpeg -i input.mp4 -filter_complex split[1],scale=-2:720[0v];[1]scale=-2:480[1v] -map "[0v]" -c:v:0 libx264 -map 0:a -c:a:0 aac -b:a:0 128k -map "[1v]" -c:v:1 libx264 -map 0:a -c:a:1 aac -b:a:1 64k -flags +global_header -f tee "[select=\'v:0,a:0\':movflags=+faststart]out1.mp4|[select=\'v:1,a:1\':movflags=+faststart]out2.mp4"

フィルタを使い分けて2出力する。
ffmpeg -i input.mp4 -filter:v scale=-2:720 -c:v libx264 -c:a copy output1.mp4 -filter:v scale=-2:480 -c:v libx264 -c:a aac -b:a 96k output2.mp4

配信先がrtmpでファイル配信の場合にはコンテナフォーマットをFLVに入れ換える。
ffmpeg -i input.mp4 -c copy input.flv

出力先がローカルではなく配信も可能。
ffmpeg -i input -vcodec libx264 -acodec aac -map 0:v -map 0:a -flags +global_header -f tee -use_fifo 1 "[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.com|[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.net|[f=flv]D:\output.flv"

複数解像度で配信して動画も保存するコマンド。
ffmpeg -i input -filter_complex split[1],scale=-2:720[720p];[1]scale=-2:1080[1080p] -map [720p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee "[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.com/720p|D:\output-720p.flv" -map [1080p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee "[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:attempt_recovery=1:recovery_wait_time=1]rtmp://example.net/1080p|[f=flv]D:\output-1080p.flv"

読みやすく改行したもの。

ffmpeg -i input -filter_complex split[1],scale=-2:720[720p];[1]scale=-2:1080[1080p] \
-map [720p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee \
"[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:\
attempt_recovery=1:recovery_wait_time=1]rtmp://example.com/720p|\
[f=flv]D:\output-720p.flv" \
-map [1080p] -map 0:a -flags +global_header -vcodec libx264 -acodec aac -f tee \
"[f=fifo:fifo_format=flv:onfail=ignore:drop_pkts_on_overflow=1:\
attempt_recovery=1:recovery_wait_time=1]rtmp://example.net/1080p|\
[f=flv]D:\output-1080p.flv"

ネットラジオなどリアルタイム配信している動画をコピー出力と1.5倍速出力を同時に行うコマンド。
ffmpeg -i "http://example.com/master.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4 -vf "setpts=2*PTS/3" -af "atempo=1.5" -vcodec libx264 -acodec aac output-x1.5.mp4

さらに VOD RTMP 配信の場合はバッファを増やさないと保存が遅くなる。
ffmpeg -rtmp_buffer 36000000 -i "rtmp://example.com/live.flv" -c copy output.flv -vf "setpts=2*PTS/3" -af "atempo=1.5" -vcodec libx264 -acodec aac output-x1.5.flv

関連記事

コメントを残す

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

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