
FFmpeg では、フィルター チェーンの途中から出力をマップすることは可能ですか?
たとえば、このコマンドでは次のようになります。
ffmpeg -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50[txt1];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50[txt2];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50[txt3];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50[txt4]" -map "[txt4]" -t 10 -y ~/Desktop/mapping.mp4
これは機能します: -map "[txt4]"。-map "[txt3]" (または txt2、または txt1) しようとすると、"
ラベル 'txt3' の出力は、定義されたフィルタ グラフに存在しないか、すでに他の場所で使用されています。"
完全なコマンドを呼び出し、フィルター チェーン ( -map [$val]
) の異なる部分を使用して、異なるファイルを出力したいと思います。
ありがとう
答え1
それは可能ですが、スプリット「中間フィルター」のフィルター。
「中間フィルター」が他のフィルターへの入力として使用されると、そのフィルターによって「消費」され、後で使用することはできません。
以下は、1 つのコマンドですべての「中間フィルター」からビデオ ファイルを作成する例です。
ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4]" -t 10 -map "[txt1out]" mapping1.mp4 -t 10 -map "[txt2out]" mapping2.mp4 -t 10 -map "[txt3out]" mapping3.mp4 -t 10 -map "[txt4]" mapping4.mp4
各ファイルを個別にエンコードするには、ストリームセレクトフィルターチェーンの最後にあるフィルター:
[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]
map=0
選択用に設定[txt1out]
、map=1
選択用に設定[txt2out]
...
サンプルコマンド:
ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4];[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]" -t 10 -map "[out]" mapping2.mp4
注: Windows で動作させるには
追加fontfile=arial.ttf
が必要でした。drawtext