FFmpeg: salida de mapeo y encadenamiento de filtros

FFmpeg: salida de mapeo y encadenamiento de filtros

En FFmpeg, ¿es posible mapear una salida desde el medio de una cadena de filtros?

Por ejemplo, en este comando:

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

Esto funciona: -map "[txt4]". Al intentar asignar "[txt3]" (o txt2 o txt1), aparece "

La salida con la etiqueta 'txt3' no existe en ningún gráfico de filtro definido o ya se usó en otro lugar".

Quiero llamar al comando completo y usar diferentes partes de la cadena de filtros ( -map [$val]) para generar diferentes archivos.

Gracias

Respuesta1

Es posible, pero tenemos que usardividirfiltro para el "filtro medio".

Cuando el "filtro intermedio" se utiliza como entrada para otro filtro, ese filtro lo "consume" y no se puede utilizar más adelante.


A continuación se muestra un ejemplo para crear archivos de vídeo a partir de todos los "filtros intermedios" con un solo comando:

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


Para codificar cada archivo por separado, podemos agregarselección de flujofiltro, al final de la cadena de filtros:

[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]

Establecer map=0para seleccionar [txt1out], establecer map=1para seleccionar [txt2out]...

Comando de muestra:

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


Nota: Fue necesario
agregar para que funcionara en Windows.fontfile=arial.ttfdrawtext

información relacionada