Guía de filtrado FFmpeg

 Documentación
Sintaxis de filtro
Gráfico de filtro, cadena, relación de filtro
Personajes que escapan
Ejemplos
Escalada
Acelera tu vídeo
Superposición de entrada múltiple en cuadrícula 2x2
Grabado en código de tiempo
Entrada sintética
Otros ejemplos de filtros
Filtrar metadatos
Filtros de secuencias de comandos
desde un archivo
Con un guión de Shell
Desarrollando sus propios filtros
Visualización de filtros

23/03/2022 19:58:10 Update:23/03/2022 21:27:14

Guía de filtrado FFmpeg

FFmpeg tiene acceso a muchos filtros y se agregan más regularmente. Para ver qué filtros están disponibles con su compilación, consulte ffmpeg -filters.

Documentación

Consulte la documentación de los filtros FFmpeg para obtener más información y ejemplos de cada filtro. Esta página wiki es para ejemplos y sugerencias aportados por los usuarios, y se recomiendan las contribuciones a esta página.

Sintaxis de filtro

Cuando la documentación se refiere a "opciones de filtro" o dice que "el filtro acepta las siguientes opciones", la sintaxis que se debe usar para las opciones es la que se describe en Filtros FFmpeg , sección 4.1 Sintaxis del gráfico de filtro . Brevemente, esa sintaxis es agregar, después del nombre del filtro, un =carácter, luego el nombre de la primera opción de filtro, un =carácter y el valor de esa opción. Si desea especificar más opciones de filtro, las delimita con :y luego agrega el nombre de la siguiente opción de filtro, un =carácter y el siguiente valor.

Por ejemplo, para aplicar el filtro loudnorm a un flujo de audio, la sintaxis básica es:

ffmpeg -i entrada -filtro: una salida de norma alta

Para agregar las opciones de filtro print_formaty , use la sintaxis:linear

ffmpeg -i input -filter:a loudnorm=print_format=summary:linear=true output

Como se describe en la sección 4.1 ​Sintaxis de Filtergraph , puede omitir los nombres y =caracteres de las opciones, proporcionando solo los valores, delimitados por :caracteres. Por ejemplo, en esta invocación:

ffmpeg -i entrada -vf escala=iw/2:-1 salida

FFmpeg asume los nombres de las opciones en el orden en que se declaran en el código fuente. Por ejemplo, en este uso del filtro de escala , FFmpeg asume el nombre de la opción widthpara el valor iw/2y el nombre heightdel valor -1.

Gráfico de filtro, cadena, relación de filtro

Lo que sigue -vfen una línea de comando ffmpeg es una descripción de filtergraph . Este gráfico de filtro puede contener una serie de cadenas, cada una de las cuales puede contener una serie de filtros.

Si bien una descripción completa del gráfico de filtro puede ser complicada, es posible simplificarla para gráficos más simples siempre que se evite la ambigüedad.

Recordando que los filtros en una cadena se separan por comas "," cadenas por punto y coma ";" y que si no se especifica una entrada o salida, se supone que proviene del elemento anterior o se envía al elemento siguiente de la cadena.

Los siguientes son equivalentes:

ffmpeg -i entrada -vf [entrada]escala=iw/2:-1[salida] salida
ffmpeg -i input -vf scale=iw/2:-1 output # la entrada y la salida están implícitas sin ambigüedad

Como son:

ffmpeg -i input -vf [in]yadif=0:0:0[middle];[middle]scale=iw/2:-1[out] salida # Se forman 2 cadenas, un filtro por cadena, cadenas unidas por [ medio] almohadilla
ffmpeg -i input -vf [in]yadif=0:0:0,scale=iw/2:-1[out] salida # 1 forma de cadena, con 2 filtros en la cadena, enlace implícito
ffmpeg -i input -vf yadif=0:0:0,scale=iw/2:-1 output # la entrada y la salida están implícitas sin ambigüedad

Personajes que escapan

Como se describe en la documentación, puede ser necesario escapar de las comas "," que deben aparecer en algunos argumentos, por ejemplo, el filtro de selección:

ffmpeg -i input -vf select='eq(pict_type\,I)' -vsync vfr output_%04d.png # para seleccionar solo cuadros I

However an alternative, which also allows for white space within the filtergraph, and which may assist in clarity of reading complex graphs, is to enclose the whole filtergraph within double quotes " " thus:

ffmpeg -i input -vf "select='eq(pict_type,I)'" output       # to select only I frames
ffmpeg -i input -vf "yadif=0:-1:0, scale=iw/2:-1" output    # deinterlace then resize

Note that the examples given in the documentation mix and match the use of "full quoting" and "\" escaping, and that use of unusual shells may upset escaping. See Notes on filtergraph escaping for more information.

Examples

Scaling

Starting with something simple. Resize a 640x480 input to a 320x240 output.

ffmpeg -i input -vf scale=iw/2:-1 output

iwes el ancho de entrada. En este ejemplo, el ancho de entrada es 640. 640/2 = 320. Le -1dice al filtro de escala que conserve la relación de aspecto de la salida, por lo que en este ejemplo el filtro de escala elegirá un valor de 240. Consulte la documentación de FFmpeg para obtener información adicional . información.

Acelera tu vídeo

Consulte Cómo acelerar/ralentizar un video para ver ejemplos.

Superposición de entrada múltiple en cuadrícula 2x2

Aquí cuatro entradas se filtran juntas usando la -filter_complexopción. En este caso, todas las entradas son -f lavfi -i testsrc(el filtro de origen de testsrc ), pero podrían ser otras entradas.

Dentro del gráfico de filtro, la primera entrada no cambia y las otras tres entradas se filtran individualmente mediante hflip , negate y edgedetect . Luego, los filtros hstack y vstack se usan para apilar cada video en la ubicación deseada.

ffmpeg -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -filter_complex \
"[1:v]negar[a]; \
 [2:v]hflip[b]; \
 [3:v]detección de borde[c]; \
 [0:v][a]hstack=entradas=2[superior]; \
 [b][c]hstack=entradas=2[abajo]; \
 [arriba][abajo]vstack=entradas=2[salida]" -map "[salida]" -c:v ffv1 -t 5 multiple_input_grid.avi

El siguiente ejemplo es el mismo que el anterior, pero en su lugar utiliza los filtros pad y overlay . El filtro de almohadilla se usa para crear un fondo de tamaño apropiado y la superposición se usa para colocar cada video en la ubicación correcta. Este método es más lento que usar hstack + vstack como se muestra arriba.

ffmpeg -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -filter_complex \
"[0:v]pad=iw*2:ih*2[a]; \
 [1:v]negar[b]; \
 [2:v]hflip[c]; \
 [3:v]detección de bordes[d]; \
 [a][b]superposición=w[x]; \
 [x][c]superposición=0:h[y]; \
 [y][d]overlay=w:h[out]" -map "[out]" -c:v ffv1 -t 5 multiple_input_grid.avi

Tenga en cuenta que los fotogramas se toman de cada video de entrada en el orden de la marca de tiempo, por lo que es una buena idea pasar todas las entradas superpuestas a través de un setpts=PTS-STARTPTSfiltro para que comiencen en la misma marca de tiempo cero, como [0:v]hflip,setpts=PTS-STARTPTS[a];[1:v]setpts=PTS-STARTPTS[b];[a][b]overlay.

Grabado en código de tiempo

Usando el filtro de video drawtext .

PAL 25 fps sin pérdida de fotogramas:

ffmpeg -i in.mp4 -vf "drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: timecode='09\:57\:00\:00': r=25: \
x=(w-tw)/2: y=h-(2*lh): fontcolor=blanco: box=1: boxcolor=0x00000000@1" -an -y out.mp4

Caída de fotogramas NTSC de 30 fps

(cambie el : a un ; antes del conteo de fotogramas)_________________________________________________________
                                                                                                     \
ffmpeg -i in.mp4 -vf "drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: timecode='09\:57\:00\;00': r=30: \
x=(w-tw)/2: y=h-(2*lh): fontcolor=blanco: box=1: boxcolor=0x00000000@1" -an -y out.mp4

Entrada sintética

El filtro de origen testsrc genera un patrón de video de prueba que muestra un patrón de color, un gradiente de desplazamiento y una marca de tiempo. Esto es útil para fines de prueba.

Este ejemplo creará una salida de 10 segundos, 30 fps (300 cuadros en total), con un tamaño de cuadro de 1280x720:

ffmpeg -f lavfi -i testsrc=duración=10:tamaño=1280x720:tasa=30 salida.mpg

ffplaytambién se puede utilizar para ver el gráfico de filtro resultante:

ffplay -f lavfi -i "testsrc=duración=10:tamaño=1280x720:tasa=30"

También puede especificar testsrc como filtro:

ffmpeg -filter_complex testsrc SALIDA

Otro tipo de testsrc está usando el filtro de fuente smptebars :

ffmpeg -f lavfi -i "smptebars=duration=5:size=1280x720:rate=30" salida.mp4

o un color

./ffmpeg -f lavfi -i color=c=rojo:tamaño=100x100

Hay otras opciones para generar entrada de video sintético, consulte aquí y aquí (filtro de "ecuación genérica").

Otros ejemplos de filtros

Filtrar metadatos

Los filtros pueden escribir entradas de metadatos que se pueden usar para depurar su funcionalidad o extraer información adicional del archivo de entrada. Para obtener una descripción general, consulte la documentación del filtro de metadatos .

Las claves de metadatos están definidas por los filtros respectivos y no hay una lista accesible globalmente. Algunos de ellos se mencionan en la propia documentación del filtro.

Aquí hay algunas claves de metadatos importantes, todas comenzando con lavfi.<filter>, donde <filter>está el nombre del filtro en sí.

Filtrar Llave Descripción
aphasemeter phase
astats Bit_depth2
astats Bit_depth
astats Crest_factor
astats DC_offset
astats Dynamic_range
astats Flat_factor
astats Max_difference
astats Max_level
astats Mean_difference
astats Min_difference
astats Min_level
astats Overall.Bit_depth2
astats Overall.Bit_depth
astats Overall.DC_offset
astats Overall.Flat_factor
astats Overall.Max_difference
astats Overall.Max_level
astats Overall.Mean_difference
astats Overall.Min_difference
astats Overall.Min_level
astats Overall.Number_of_samples
astats Overall.Peak_count
astats Overall.Peak_level
astats Overall.RMS_difference
astats Overall.RMS_level
astats Overall.RMS_peak
astats Overall.RMS_trough
astats Peak_count
astats Peak_level
astats RMS_difference
astats RMS_level
astats RMS_peak
astats RMS_trough
astats Zero_crossings_rate
astats Zero_crossings
bbox h
bbox w
bbox x1
bbox x2
bbox y1
bbox y2
blackframe pblack
cropdetect h
cropdetect w
cropdetect x1
cropdetect x2
cropdetect x
cropdetect y1
cropdetect y2
cropdetect y
ebur128 r128.I
ebur128 r128.LRA.high
ebur128 r128.LRA.low
ebur128 r128.LRA
ebur128 r128.M
ebur128 r128.S
freezedetect freeze_duration Duración del período de congelación
freezedetect freeze_end Fin del período de congelación
freezedetect freeze_start Inicio del período de congelación
psnr mse.u
psnr mse.v
psnr mse.y
psnr mse_avg
psnr psnr.u
psnr psnr.v
psnr psnr.y
psnr psnr_avg
signalstats HUEAVG
signalstats HUEMED
signalstats key
signalstats SATAVG
signalstats SATHIGH
signalstats SATLOW
signalstats SATMAX
signalstats SATMIN
signalstats UAVG
signalstats UBITDEPTH
signalstats UDIF
signalstats UHIGH
signalstats ULOW
signalstats UMAX
signalstats UMIN
signalstats VAVG
signalstats VBITDEPTH
signalstats VDIF
signalstats VHIGH
signalstats VLOW
signalstats VMAX
signalstats VMIN
signalstats YAVG
signalstats YBITDEPTH
signalstats YDIF
signalstats YHIGH
signalstats YLOW
signalstats YMAX
signalstats YMIN
silencedetect silence_duration Duración del período de silencio
silencedetect silence_end Fin del período de silencio
silencedetect silence_start Inicio del período de silencio
ssim All
ssim dB
ssim u
ssim v
ssim y

Filtros de secuencias de comandos

desde un archivo

Suponga que desea cambiar algunos parámetros de filtro en función de un archivo de entrada. Algunos filtros admiten la opción de recibir comandos a través de `sendcmd` . Ejecute ffmpeg -filtersy verifique la Ccolumna; si está presente, un filtro admite la recepción de entrada de esta manera.

Por ejemplo, si desea rotar la entrada en los segundos 0, 1 y 2, cree un archivo llamado cmd.txtcon el contenido:

0 ángulo de rotación '45*PI/180';
1 ángulo de rotación '90*PI/180';
2 ángulo de rotación '180*PI/180';

Ahora ejecute una secuencia de ejemplo:

ffmpeg -f lavfi -i testsrc -filter_complex "[0:v]sendcmd=f=cmd.txt,rotate" -f matroska - | jugar-

Algunos ejemplos de esta técnica se pueden ver ​aquí .

Con un guión de Shell

Al crear gráficos de filtros complejos, puede ser útil dividir el comando en partes manejables. Sin embargo, hay que tener cuidado al unirlos todos, para evitar problemas debido a caracteres escapados.

El siguiente ejemplo muestra un script bash de muestra que contiene un gráfico de filtro de una cadena con tres filtros: yadif, scale y drawtext.

#!/bin/bash
# script de prueba ffmpeg

ruta="/ruta/al/archivo/"

in_file="en.mp4"
out_file="salida.mp4"

cd $ruta

filter="yadif=0:-1:0, scale=400:226, drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: \
text='tod- %X':x=(w-text_w)/2:y=H-60 :fontcolor=white :box=1:boxcolor=0x00000000@1"
códec="-vcodec libx264 -pix_fmt yuv420p -b:v 700k -r 25 -maxrate 700k -bufsize 5097k"

command_line=(ffmpeg -i "$in_file" -vf "$filter" "$codec" -an $out_file")

echo "${línea_de_comandos[@]}"
"${línea_de_comando[@]}"
Salida

Tenga en cuenta que el gráfico de filtro abarca más de una línea. El comando echo muestra el comando completo a medida que se ejecuta. Esto es útil para la depuración.

La matriz en la $command_linevariable ayuda a evitar la pérdida de las comillas que ocurre de otra manera. Otras conchas pueden comportarse de manera diferente.

Desarrollando sus propios filtros

Visualización de filtros

A veces ffmpeginserta diferentes filtros (p. ej., filtros de conversión de formato de píxel) en un gráfico de filtro para que funcione. Para ver lo que "realmente está pasando", ejecútelo como ffmpeg -loglevel debug .... Útil para encontrar filtros insertados automáticamente.

También puede obtener una representación gráfica divertida de su filtergraph ejecutando el comando graph2dot "incluido" como graph2dot "my filter graph".

También hay una dumpgraphopción si puede convertir a lavfisintaxis: ffmpeg -dumpgraph 1 -f lavfi -i "..."que genera una bonita vista de arte ASCII de su gráfico.

Archivos adjuntos (1)

Descargar todos los archivos adjuntos como: .zip

Nota: Consulte TracWiki para obtener ayuda sobre el uso de la wiki.




www.compostela21.com
diariocompostela21@gmail.com
28/03/2024