
Возможно ли в 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
Это возможно, но мы должны использоватьрасколотьфильтр для «среднего фильтра».
Когда «средний фильтр» используется в качестве входных данных для другого фильтра, он «потребляется» этим фильтром и не может быть использован позже.
Вот пример создания видеофайлов из всех «средних фильтров» с помощью одной команды:
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
Для кодирования каждого файла отдельно мы можем добавитьstreamselectфильтр, в конце цепочки фильтров:
[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
Примечание:
добавление fontfile=arial.ttf
потребовалось для drawtext
работы в Windows.