Marca de agua vídeo con PHP FFMpeg

eXtreM3

Buenos días y feliz martes lo primero,
vengo con otro problema tontorrón. Quiero automatizar unas creaciones de vídeo con marca de agua con ffmpeg y ahora mismo estoy utilizando la librería https://github.com/PHP-FFMpeg/PHP-FFMpeg que se supone que te permite hacerlo.

El problema es que el apartado Watermark de la docu no me funciona, da un error de interpretación con el path de la imagen (y he comprobado varias veces que sea correcto, además de intentar cambiar la exposición y escapado de los separadores de directorio)

He probado a mano el comando y funciona perfectamente, así:

ffmpeg -i app/videos/1-720p.mp4 -i app/watermark/watermark-6.png -filter_complex overlay=0:0 -map 0:v -map -vcodec app/videos/exported-6.mp4

Así que bueno, he intentado tirar por la opción AdvancedMedia de la docu, la cual se supone que te permite crear un filtro custom y el resultado sería lo mismo => filter complex overlay

$videoPath = storage_path('app/videos/1-720p.mp4');
$watermarkPath = storage_path('app/watermark/watermark-6.png');
$outputPath = storage_path('app/videos/exported-6.mp4');

$video = $ffmpeg->openAdvanced([$videoPath, $watermarkPath]);
$video->filters()->custom('[0:v][1:v]', 'overlay=0:0', '[v]');
$video->map(['[0:v][1:v]', '[v]'], new \FFMpeg\Format\Video\X264(), $outputPath);
$video->save();

Estoy obteniendo este error:

Output with label '0:v' does not exist in any defined filter graph, or was already used elsewhere.

He probado varias cosas y no lo soluciono, no me entero.

Info: la posición del overlay es 0:0 porque la imagen de la marca de agua mide 1280x720, exactamente igual que el vídeo, es una transparencia a tamaño completo.

A ver si damos con la tecla, thank you!

r2d2rigo

Asi a bote pronto prueba a pasarle los paths a ffmpeg con url http porque estoy segurisimo que php.exe no tiene acceso a los directorios que le estas pasando.

1 respuesta
eXtreM3

#2 no era eso, estaba comprobado que las rutas fuesen correctas. Era tema de parámetros, por fin conseguí dar con la tecla:

$video = $ffmpeg->openAdvanced([$videoPath, $watermarkPath]);
$video->filters()->custom('[0:v][1:v]', 'overlay=0:0', '[out]');
$video->map(['[out]'], new \FFMpeg\Format\Video\X264(), $outputPath);
$video->save();

:cowboy:

Usuarios habituales

  • eXtreM3
  • r2d2rigo