Comandos FFmpeg: de principiante a experto | filtro ffmpeg (filtro/filtro)
Comandos FFmpeg: de principiante a experto | filtro ffmpeg (filtro/filtro)
Esta sección presenta principalmente el filtro ffmpeg y enumera algunos filtros de uso común y cómo usarlos.
Hay muchos tipos de filtros ffmpeg, que también es el punto más difícil de aprender ffmpeg.
ffmpeg filtra variables integradas básicas
variable | ilustrar |
---|---|
t | marca de tiempo en segundos, o NAN si se desconoce el tiempo de entrada |
norte | Ingrese el número secuencial del cuadro, comenzando desde 0 |
posición | La posición del marco de entrada, o NAN si se desconoce |
w | Ancho del cuadro de vídeo de entrada |
h | La altura del fotograma de vídeo de entrada. |
Recorte de vídeo
Tamaño de la imagen de entrada: iw * ih, coordenadas iniciales (x, y), tamaño de salida recortada: ow * oh.
Mostrar directamente:
ffplay -i input.jpg -vf crop=ow:oh:x:y
Imagen de salida:
ffmpeg -i input.jpg -vf crop=ow:oh:x:y output.jpg
Recorta el área media con tamaño 100 * 100:
ffmpeg -i input.jpg -vf crop=100:100 output.jpg
Recorta el área central a 2/3 del vídeo de entrada:
ffmpeg -i input.flv -vf crop=2/3*in_w:2/3*in_h output.flv
Recorta el área central a un cuadrado con la altura del video de entrada:
ffmpeg -i input.flv -vf crop=out_w=in_h output.flv
o
ffmpeg -i input.flv -vf crop=in_h output.flv
Ejemplo 1:
ffmpeg -i input.jpg -vf crop=iw/3:ih:iw/3:0 output.jpg
A partir de las coordenadas (iw/3, 0), recorte una imagen con un ancho iw/3 y una altura ih, asígnele el nombre salida.jpg y guárdela.
entrada.jpg:
salida.jpg:
Ejemplo 2:
ffplay -i input.jpg -vf crop=iw/3:ih/2:0:0
A partir de las coordenadas (0, 0), se recorta y muestra una imagen con ancho iw/3 y alto ih/2:
marca de agua de texto
Agregar marcas de agua de texto a videos requiere muchos preparativos. Debe tener archivos relevantes para el procesamiento de fuentes de texto. Al compilar FFmpeg, debe admitir FreeType, FontConfig e iconv. Debe tener fuentes relevantes en el sistema. Puede agregar letras puras marcas de agua a FFmpeg. Utilice el filtro drawtext como soporte. Echemos un vistazo a los parámetros de filtro de drawtext:
parámetro | tipo | ilustrar |
---|---|---|
texto | cadena | Contenido del personaje |
Archivo de texto | cadena | Un archivo que almacena contenido de texto. |
caja | valor booleano | Cuadro de fondo del área de texto, el valor predeterminado es falso |
color de caja | color | Mostrar el color del bloque del área de fuente |
fuente | cadena | Nombre de fuente, el valor predeterminado es fuente Sans |
tamaño de fuente | entero | tamaño de fuente |
X y Y | cadena | La posición donde aparece la marca de agua del texto, con la esquina superior izquierda del video como coordenada inicial, y el valor predeterminado es 0 |
alfa | número de coma flotante | Transparencia, un número de coma flotante con un valor de 0 ~ 1, el valor predeterminado es 1 |
Ejemplo 1: agregar una marca de agua de texto en la esquina superior izquierda del video
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"
Establezca el color de fuente en verde:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"
Si desea ajustar la posición de la visualización de la marca de agua de texto, simplemente ajuste los valores de los parámetros xey:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200"
Modificar transparencia:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200:alpha=0.5"
También puede agregar un cuadro a la marca de agua del texto y luego agregar un color de fondo al cuadro:
ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
Efecto:
Nota: Todo el filtro está entre comillas y cada parámetro está separado por dos puntos.
Ejemplo 2: utilizar la hora local como contenido de marca de agua
A veces, las marcas de agua de texto quieren usar la hora local como contenido de la marca de agua. Esto se puede hacer con algún uso especial en el filtro de texto de dibujo. La hora local actual se muestra en texto en el formato de año, mes, día, hora, minuto y segundo.
ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=20:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"
Efecto:
Nota: La hora se mostrará en tiempo real y cambiará constantemente.
Cuando use ffmpeg para transcodificarlo y almacenarlo en un archivo, debe agregar -re (lo que significa marca de agua según la marca de tiempo, debido a que está transcodificando, habrá varios fotogramas en 1 y habrá excepciones cuando se muestre de acuerdo con el hora actual), de lo contrario la hora es incorrecta.
ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" output.mp4
En algunas escenas, es necesario mostrar la marca de agua regularmente o no mostrarla regularmente. Este método también se puede procesar con el filtro drawtext. Use drawtext junto con enable. Por ejemplo, una marca de agua de texto se muestra cada 3 segundos:
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"
Nota: Debe agregar -re cuando use ffmpeg para transcodificar y almacenar en un archivo; de lo contrario, la hora será incorrecta.
Referencia de expresión: FFmpeg Utilities Documentación 3 Evaluación de expresión
- lt(x, y): devuelve 1 si x es menor que y, 0 en caso contrario. Devuelve 1 si x es menor que y, en caso contrario devuelve 0
- mod(x, y):Calcula el resto de la división de x entre y.x 对 y 取余。
Ejemplo 3: efecto marquesina
Marco significa que la marca de agua del texto fluctúa en la interfaz de video y las coordenadas horizontales x, y se modifican dinámicamente de acuerdo con la fórmula mod para lograr el efecto de marco.
ffplay -i input.mp4 -vf "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"
Efecto: la marca de agua del texto aparece cíclicamente en una línea de función sinusoidal.
Modifique la transparencia y el color de la fuente:
ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"
Efecto:
Marca de agua de imagen
Además de agregar marcas de agua de texto a videos, FFmpeg también puede agregar marcas de agua de imágenes, tickers de video, etc.
Para agregar marcas de agua de imagen a videos, puede usar el filtro de películas. Familiaricémonos con los parámetros del filtro de películas:
parámetro | tipo | ilustrar |
---|---|---|
Nombre del archivo | cadena | Ingrese el nombre del archivo, que puede ser un archivo, protocolo, dispositivo, etc. |
nombre_formato o f | cadena | El formato de empaquetado del archivo de entrada. |
índice_corriente | entero | El número de índice de secuencia del archivo de entrada. |
buscar_punto o sp | número de coma flotante | La posición temporal del flujo de entrada. |
corrientes o s | cadena | Transmitir información para múltiples flujos de entrada |
bucle | entero | Ciclos |
discontinuidad | diferencia horaria | Soporte para diferencias de marcas de tiempo fluctuantes |
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4
parámetro:
- -i: ruta del archivo de vídeo original
- Ruta de la imagen de la marca de agua: logo.png
- Posición de la marca de agua: (x, y) = (10, 10) <= (izquierda, arriba), 10 píxeles desde la izquierda y arriba
- Ruta del archivo de salida: salida.mp4
- en: representa input.mp4, el nombre se puede determinar aleatoriamente
- marca de agua: representa el logo.png que se va a superponer, el nombre se puede determinar aleatoriamente.
¿Cómo determinar la ubicación de la marca de agua de la imagen?
parámetro | ilustrar |
---|---|
principal_w | Ancho de imagen de un solo cuadro de vídeo |
principal_h | Altura de la imagen de un solo cuadro de vídeo |
superposición_w | Ancho de imagen de un solo cuadro de vídeo |
principal_h | Altura de la imagen de un solo cuadro de vídeo |
En consecuencia, puede configurar el parámetro de superposición en el siguiente valor para cambiar la posición de la imagen de la marca de agua:
Ubicación de la marca de agua de la imagen | valor de superposición |
---|---|
esquina superior izquierda | 10:10 |
esquina superior derecha | main_w-overlay_w-10:10 |
esquina inferior izquierda | 10:main_h-overlay_h-10 |
esquina inferior derecha | main_w-overlay_w-10:main_h-overlay_h-10 |
Consejos: si la imagen de la marca de agua tiene un fondo transparente, el efecto será mejor.
Del mismo modo, también podemos añadir un efecto marquesina:
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
imagen dentro de imagen
Imagen en imagen, como su nombre indica, es un vídeo que se reproduce con otro vídeo superpuesto.
Al reproducir archivos multimedia en streaming usando FFmpeg, a veces es necesario utilizar el efecto de imagen en imagen.
En FFmpeg, se pueden fusionar múltiples transmisiones de video, múltiples dispositivos de captura multimedia y múltiples archivos de video en una interfaz mediante superposición para generar un efecto de imagen en imagen.
En el uso anterior de filtros, e incluso en el uso futuro de filtros, la mayor parte del procesamiento relacionado con las operaciones de video se usará junto con el filtro de superposición, especialmente en escenarios de procesamiento y fusión de capas. los parámetros de superposición:
parámetro | tipo | ilustrar |
---|---|---|
X | cadena | coordenada x |
y | cadena | coordenada y |
eof_acción | entero | 遇到 eof 表示时的处理方式。repeat(值为0):重复前一帧,子画面保存前一帧;endcall(值为1):停止所有的流,主画面和子画面全部停止;pass(值为2):保留主画面,子画面关闭。默认为repeat(值为0) |
shortest | 布尔值 | 值为 true 时,最短的视频终止时全部视频终止。默认值为 false |
format | 整数 | 设置 output 的像素格式。有以下几种格式:yuv420(值为0)、yuv422(值为1)、yuv444(值为2)、rgb(值为3).默认值为yuv420(值为0) |
显示画中画效果:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
图解:
参数:
- [sub]:表示要叠加的子画面
- [in]:表示输入的视频
- [in][sub]overlay=x=20:y=20[out]:表示输入和 sub 子画面叠加,叠加的位置由 x, y 决定,out 表示输出,sub 子画面的名字可以随意修改
效果:
子画面停止退出显示,主画面正常播放:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=2[out]"
最短的视频播完则整个画面停止播放:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest=1[out]"
重新设定子画面尺寸:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"
跑马灯效果:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
视频多宫格处理
视频除了画中画显示,还有一种场景为以多宫格的方式呈现出来,除了可以输入视频文件,还可以输入视频流、采集设备等。
从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过 FFmpeg 建立一个画布,也可以使用默认的画布。
如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,下面就来看一下多宫格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4
看到这么长的命令可能已经晕了,其实将命令拆分解析一下就很简单了,对命令进行拆分解析:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 #所有输入
-filter_complex "nullsrc=size=640x480[base]; #创建了一个base的画面,大小640*480
[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft]; #视频1命令为upperleft,缩放为320x240
[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright]; #视频2命令为upperright,缩放为320x240
[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft]; #视频3命令为lowerleft,缩放为320x240
[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright]; #视频4命令为lowerright,缩放为320x240
[base][upperleft]overlay=shortest=1[tmp1]; # [base][upperleft]叠加生成[tmp1],upperleft没设置就是叠加在(0,0)位置
[tmp1][upperright]overlay=shortest=1:x=320[tmp2]; #[tmp1][upperright]叠加生成[tmp2],叠加在(320,0)位置
[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3]; #[tmp2][lowerleft]叠加生成[tmp3]
[tmp3][lowerright]overlay=shortest=1:x=320:y=240" #[tmp3][lowerright]叠加生成最终的输出
out.mp4
说明:
- 1.mp4、2.mp4、3.mp4、4.mp4 为文件路径
- out.MP4 为输出文件路径
- 通过 nullsrc 创建 overlay 画布,画布大小 640:480
- 使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理
- 基于 nullsrc 生成的画布进行视频平铺,命令中自定义 upperleft, upperright, lowerleft, lowerright 进行不同位置平铺。
图解:
效果:
Cuando no hay vídeo en una parte del fotograma, ese fondo aparece en verde. Como sigue: