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_format
y , 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 width
para el valor iw/2
y el nombre height
del valor -1
.
Gráfico de filtro, cadena, relación de filtro
Lo que sigue -vf
en 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
iw
es el ancho de entrada. En este ejemplo, el ancho de entrada es 640. 640/2 = 320. Le -1
dice
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_complex
opció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-STARTPTS
filtro 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
ffplay
tambié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
- Ejemplos de filtros sofisticados : ejemplos de varios efectos psicodélicos y otros filtros extraños.
- Null describe el filtro nullsink.
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 -filters
y verifique la C
columna; 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.txt
con 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_line
variable 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 ffmpeg
inserta 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 dumpgraph
opción si puede convertir a lavfi
sintaxis: ffmpeg -dumpgraph 1 -f lavfi -i "..."
que genera una bonita vista de arte ASCII de su gráfico.
Archivos adjuntos (1)
- multiple_input_overlay.jpg ( 22.3 KB ) - agregado por hace 9 años .
Descargar todos los archivos adjuntos como: .zip