Aprende a convertir un video webm a mp4 fácilmente usando FFMpeg en Symfony 3

Cómo convertir un video webm a mp4 usando FFMpeg en Symfony 3

WebM es un formato de archivo multimedia abierto, libre de regalías, diseñado para la web que define la estructura del contenedor de archivos, los formatos de video y audio. Los archivos WebM consisten en transmisiones de video comprimidas con los códecs de video VP8 o VP9 y transmisiones de audio comprimidas con los códecs de audio Vorbis u Opus. La estructura de archivos de WebM se basa en el contenedor Matroska. WebM es 100% gratuito y de código abierto bajo una licencia de estilo BSD. Muchos proyectos de código abierto basados ​​en WebRTC que le permiten, por ejemplo, grabar un video desde el navegador y subirlo a su servidor, usan el formato webm ya que es uno de los formatos más conocidos para la web.

A veces, su usuario necesitará los videos grabados fuera del navegador por diferentes razones y es posible que su proyecto también necesite brindar soporte para este tipo de usuarios simplemente convirtiendo el video a su versión mp4 para que también se pueda reproducir en múltiples plataformas. En este artículo, compartiremos contigo un fragmento útil que usa PHP FFMpeg para convertir un video webm a mp4 fácilmente.

1. Instale los binarios de FFMpeg

Como primer paso, deberá instalar FFMpeg en su máquina de desarrollo. FFmpeg es el marco multimedia líder, capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtrar y reproducir prácticamente cualquier cosa que los humanos y las máquinas hayan creado. Soporta los formatos antiguos más oscuros hasta la vanguardia. No importa si fueron diseñados por algún comité de estándares, la comunidad o una corporación. También es altamente portátil: FFmpeg compila, ejecuta y pasa nuestra infraestructura de prueba FATE en Linux, Mac OS X, Microsoft Windows, BSD, Solaris, etc.en una amplia variedad de entornos de construcción, arquitecturas de máquinas y configuraciones.

Para convertir su video de webm a mp4, ejecutaremos algunos comandos que le permitirán lograr esto usando una biblioteca de terceros para PHP. Puede instalar FFMpeg en diferentes plataformas:

Windows

Para utilizar ffmpeg en Windows, debe descargar los binarios de este sitio web . También necesitará tener el comando ffmpeg disponible en la ruta en caso de que esté en la ventana, por ejemplo, debería poder imprimir la versión de ffmpeg ejecutando el comando ffmpeg -version en el símbolo del sistema:

ffmpeg command prompt in Windows

Si no deseas agregar el ejecutable como una variable de entorno en Windows, también puede configurar la ruta de los binarios más adelante durante la creación de una instancia de ffmpeg con PHP:

$ffmpeg = FFMpeg\FFMpeg::create(array(
    'ffmpeg.binaries'  => '/opt/local/ffmpeg/bin/ffmpeg',
    'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
    'timeout'          => 3600, // El tiempo de espera del proceso subyacente
    'ffmpeg.threads'   => 12,   // La cantidad de subprocesos que debe usar FFMpeg
), $logger);

Ubuntu

Simplemente ejecute el siguiente comando desde su terminal:

sudo apt-get install ffmpeg

Para obtener más información y los pasos para instalar en otros sistemas operativos, visite la página oficial de descargas del sitio web de ffmpeg aquí .

2. Instale PHP FFMpeg

Para interactuar con FFMpeg con PHP, necesitará escribir sus propios comandos de ffmpeg para ejecutarlos usando shell_exec o usar una biblioteca que lo haga por usted. Estamos hablando de PHP-FFMpeg, una biblioteca orientada a objetos que te permite convertir archivos de video / audio con FFmpeg / AVConv con una sintaxis amigable para desarrolladores. La forma preferida de instalar esta biblioteca en su proyecto Symfony es utilizando composer.

Para agregar este contenedor a su proyecto, ejecute el siguiente comando en su terminal (ubicado en el directorio raíz de su proyecto Symfony):

composer require php-ffmpeg/php-ffmpeg

Después de la instalación, podrá utilizar los espacios de nombres de la biblioteca.

3. Conversión de video

Ahora que tiene ffmpeg instalado en la máquina de desarrollo y el contenedor para escribir la lógica de conversión en PHP, finalmente podemos proceder a convertirlo con código. Como primer paso, es necesario incluir los espacios de nombres requeridos por ffmpeg, en este caso solo necesitamos la herramienta FFMpeg y la clase x264 que permite convertir un video a Mp4. Debe crear una instancia estática de FFMpeg y almacenarla en una variable, puede proporcionar otras configuraciones en este método como se menciona en los documentos .

A continuación, debe obtener la ruta absoluta al video webm que desea convertir y proporcionarlo como primer argumento para el openmétodo de nuestro objeto de manipulación de medios creado anteriormente. Este método devuelve un objeto Video que se puede usar para guardar, hacer modificaciones, etc. En este caso solo queremos guardarlo con otro formato, por lo que deberá crear también una instancia del códec X264 y proporcionarlo como primer argumento en el método de guardado del video. Como segundo argumento, debe proporcionar la ruta de destino del nuevo archivo mp4 y ¡listo!

Nota

Como cada ejemplo de código en Our Code World, lo escribimos tan simple como podemos para que todos puedan entenderlo. Puede crear esto, obviamente, como un servicio para mantener sus controladores delgados.

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
 
// Utilice la herramienta FFMpeg
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        // Crea una instancia de FFMpeg
        $ffmpeg =  FFMpeg::create();
        
        // En este ejemplo tenemos una ruta para los videos.
        $videosDirectory = $this->get('kernel')->getRootDir() . '/../web/uploads';
        
        // Abra el video webm que proporciona la ruta absoluta
        $video = $ffmpeg->open($videosDirectory . '/video.webm');
        
        // Configurar el nuevo formato mp4 (x264)
        $mp4Format = new X264();

        // Solución del error  "Encoding failed : Can't save to X264"
        // Ver: https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues/310
        $mp4Format->setAudioCodec("libmp3lame");
        
        // Guarde el video en el mismo directorio con el nuevo formato
        $video->save($mp4Format, $videosDirectory . '/video.mp4');

        return new Response("video webm convertido con éxito a mp4");
    }
}

Después de acceder a la ruta de índice del controlador anterior, ahora debería haber 2 archivos en el directorio de cargas, el video webm original y la nueva versión en formato mp4.

Que te diviertas 🧡!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores