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.

Insertar descripción de la imagen aquí

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:

entrada.jpg

salida.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:

Insertar descripción de la imagen aquí

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:

Insertar descripción de la imagen aquí

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:

Insertar descripción de la imagen aquí

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.

Insertar descripción de la imagen aquí

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:

Insertar descripción de la imagen aquí

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?

Insertar descripción de la imagen aquí

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]"

图解:

Insertar descripción de la imagen aquí

参数:

  • [sub]:表示要叠加的子画面
  • [in]:表示输入的视频
  • [in][sub]overlay=x=20:y=20[out]:表示输入和 sub 子画面叠加,叠加的位置由 x, y 决定,out 表示输出,sub 子画面的名字可以随意修改

效果:

Insertar descripción de la imagen aquí

子画面停止退出显示,主画面正常播放:

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 进行不同位置平铺。

图解:

Insertar descripción de la imagen aquí

效果:

Insertar descripción de la imagen aquí

Cuando no hay vídeo en una parte del fotograma, ese fondo aparece en verde. Como sigue:

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/ProgramNovice/article/details/133495109
Recomendado
Clasificación