FFmpeg - 過濾器連結和映射輸出

FFmpeg - 過濾器連結和映射輸出

在 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]」。當嘗試映射“[txt3]”(或txt2,或txt1)時,我得到“

帶有標籤“txt3”的輸出不存在於任何定義的過濾器圖中,或已在其他地方使用。

我想調用完整的命令並使用過濾器鏈(-map [$val])的不同部分來輸出不同的文件。

謝謝

答案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.ttfdrawtext

相關內容