Añadir logo a videos con FFmpeg en PHP

3 de Octubre - en PHP

Una de las herramientas incluidas en la librería FFmpeg, de mucha utilidad, es poder fusionar un video con una imagen. Utilizando esta función conseguiremos añadir un logo o texto a cualquier video.

Marca de agua a video con FFmpeg en PHP

Comando en FFMpeg

ffmpeg -i  video.mp4 -i logo.png -filter_complex overlay  salida.mp4

En donde:

  1. i  video.mp4: video de entrada.
  2. -i logo.png: Imagen a fusionar.
  3. -filter_complex overlay: Filtro utilizado para realizar la fusión.
  4. salida.mp4: Video de salida.

Generando la imagen para fusionar

La imagen que utilizaremos debe tener las mismas dimensiones que el video, para esto utilizaremos la librería FFprobe, para obtener los datos del video, y posteriormente crear la imagen con la librería GD2 de PHP.

Una vez  generada la imagen con una transparencia del 100%, tendremos un lienzo en donde añadir un logo o texto.

Código:

$video = 'video.mp4';//Url del video
$salida = 'ejemplo2.mp4';//Nombre de salida
	
//Recuperar informacion del video y decodificarla
exec('ffprobe -i '.$video.' -v quiet -print_format json -show_format -show_streams -hide_banner', $out, $res)
$info = json_decode(implode($out));
	
//Datos a extraer
$w = $info->streams[0]->width;//Ancho del video
$h = $info->streams[0]->height;//Alto del video
	
//Creamos un lienzo de color negro con la dimenciones del video
$imagen = imagecreatetruecolor($w, $h);
	
//Indicamos que la $imagen tendra el canal alfha activo
imagesavealpha($imagen, true);
	
//Generamos un color 100% transparente
$alpha = imagecolorallocatealpha($imagen, 0, 0, 0, 127);
	
//Rellenamos a $imagen con el color $alpha
imagefill($imagen, 0, 0, $alpha);	
		
//Color del texto
$clt = imagecolorallocate($imagen, 0, 0, 0);
	
//Guardamos la imagen
imagepng($imagen, 'marca.png');
imagedestroy($imagen);	

Fusionando la imagen con el video

Es importante guardar la imagen generada en formato PNG para conservar la transparencia.

Código:

//Fusionar el video con la marca de a guar
exec('ffmpeg -i '.$video.' -i marca.png -filter_complex overlay '.$salida, $out, $res);

Añadir texto a un video

Para añadir un texto utilizaremos la función imagettftext, la cual nos permite generar un texto a partir de una fuente True Type Font, a su vez, usaremos imagettfbbox, para calcular el tamaño del texto generado y posicionarlo en la imagen de lienzo.

Código:

//Color del texto
$clt = imagecolorallocate($imagen, 0, 0, 0);
	
//Tamaño de la fuente en puntos
$size = 18;
	
//Ruta de la fuente
$fuente = 'Oswald.ttf';
	
//Margen de la marca de agua
$margen = 10;
	
//Texto como marca
$texto = 'Video codificado con FFmpeg';
	
//Utilizando la funcion imagettfbbox para calcular el alto y ancho del texto en pixeles	
$box = imagettfbbox($size, 0, $fuente, $texto);
$tw = $box[4];
$th = $box[5]*(-1);
	
//Calculando las coordenadas
$x = $w - $tw - $margen; 
$y = $h - $th - $margen;

//Añadir el texto
imagettftext($imagen, $size, 0, $x, $y, $clt, $fuente, $texto);

En este ejemplo se utilizado la fuente Oswald.ttf, la cual debe de estar en el mismo directorio que el Script, o en su defecto indicar su ruta en el sistema.

Resultado:

Añadir una imagen a un video

Para añadir una imagen como logo, utilizaremos la función imagecopy. En este ejemplo, utilizaremos las dimensiones del logo, para colocarlo de forma dinámica.

Código:

//Cargando la marca de agua en formato PNG
$logo = imagecreatefrompng('logo.png');
	
//Obteniendo el alto y ancho de la imagen logo.png
$lw = imagesx($logo);
$lh = imagesy($logo);
	
//Margen de la marca de agua
$margen = 10;
	
//Calculando coordenadas para colocar el logo en la esquina inferior izquierda
$x = $w - $lw - $margen; 
$y = $h - $lh - $margen;
	
//Colocando la marca de agua, en la esquina inferior izquierda
imagecopy($imagen, $logo, $x, $y, 0, 0, $lw, $lh);

Resultado final:

 

Ejemplo

Descargar
Etiquetas
PHP jqueryffmpeggd
Compartir