Mi tarea reciente fue desarrollar un software de edición de video en línea similar a Biteable, Moovly, etc. Bueno, sabía que podía usar PHP-FFmpeg
biblioteca que me permite escribir secuencias de comandos PHP y que puede interactuar con ffmpeg
instalado en el sistema. Uno de los requisitos del proyecto era agregar una pista de audio al video seleccionado. El ffmpeg
La herramienta de línea de comandos me permite ingresar múltiples archivos usando -i
argumento. Así que simplemente puedo pasar los archivos de audio y video como un argumento y el trabajo está hecho. Sin embargo, lograr lo mismo usando la biblioteca PHP-FFMpeg fue un desafío. En este tutorial, explicaré cómo permitir múltiples archivos de entrada en la biblioteca PHP-FFMPeg.
Veamos el siguiente comando donde -i
El argumento se usa para pasar múltiples archivos de entrada al ffmpeg
comando.
$ffmpeg -i movie.mp4 -i audio.mp3 -codec:a libmp3lame -b:a 128k movie_output.mp4
Pero lograr lo mismo en el código PHP-FFMpeg no es sencillo. No pude encontrar ninguna documentación relevante que explicara el procedimiento para agregar varios archivos de entrada (-i movie.mp4 -i audio.mp3)
.
Cómo permitir múltiples archivos de entrada en PHP-FFMPeg
Después de una búsqueda exhaustiva, encontré una solución en StackOverflow. La solución es agregar la segunda entrada como filtro. A continuación se muestra la solución rápida del código:
$audioSource = 'audio.mp3'; $video->addFilter(new SimpleFilter(['-i ', $audioSource]));
A continuación se muestra el código completo para agregar una pista de audio al video. Asegúrese de que movie.mp4, audio.mp3 y php-ffmpeg estén disponibles en la ruta donde se encuentra este archivo.
<?php require_once 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create(); $format = new FFMpeg\Format\Video\X264(); $format->setAudioCodec("aac"); $videoFile='movie.mp4'; $audioFile='audio.mp3'; $captionStaticFilePath=$_SERVER['DOCUMENT_ROOT'].'/'; $outputFile='movie_output.mp4'; try{ $video = $ffmpeg->open($captionStaticFilePath.$videoFile); $video->addFilter(new FFMpeg\Filters\Audio\SimpleFilter(['-i', $audioFile])); $video->save($format, $captionStaticFilePath.$outputFile); die('done'); }catch(Exception $e){ echo $e->getMessage();die; } ?>