3

Me gustaría saber como generar un vídeo a partir de imágenes y audio subido desde php.

<?php
  $exito = 0;
  if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    foreach ($_FILES['imgToUpload']['name'] as $i => $name) {
      if (strlen($_FILES['imgToUpload']['name'][$i]) > 1) {
        if (move_uploaded_file($_FILES['imgToUpload']['tmp_name'][$i], 'upload/'.$name)) {
          $exito=1;
        }
      }
    }
    if (strlen($_FILES['audioupload']['name']) > 1) {
      if (move_uploaded_file($_FILES['audioupload']['tmp_name'], 'upload/audioPrincipal.mp3')) {
        $exito=2;
      }
    }


    if (strlen($_FILES['audio2upload']['name']) > 1) {
      move_uploaded_file($_FILES['audio2upload']['tmp_name'], 'upload/audioSecundario.mp3');
    }


  }
  if ($exito >= 2) {
    echo "<p style='color: green'>Subida con &eacute;xito</p>";
  }


 ?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
        Imagenes: <input name="imgToUpload[]" id="imgToUpload" type="file" multiple="" /><br>
        Audio: <input type="file" name="audioupload" value="audioupload" id="audioupload"><br>
        Audio secundario(opcional): <input type="file" name="audio2upload" value="audio2upload" id="audio2upload"><br>
        <!-- Audio secundario reducirle el volumen sobre el otro audio -->
        <input type="submit" value="Generar">
      </form>
  </body>
</html>
rnrneverdies
  • 16,491
  • 3
  • 49
  • 79
Hamwen
  • 81
  • 7

1 Answers1

5

Usa ffmpeg.

Si bien es posible hacerlo de otras formas, ffmpeg es la herramienta de facto (ademas de ser gratuita) para procesar video y audio. Como tiene licencia GNU hay algunas restricciones de como distribuir, pero en un sitio web (que queda en modalidad SaaS, ver esto) es perfectamente legal usarlo.

Lo que tienes que hacer es:

1 - Subir las imágenes y audios a alguna ubicación bien conocida dentro del server.

2 - Crear un archivo de texto con el formato concat de ffmpeg. Ejemplo:

file '/ruta/a/animales.png'
duration 5
file '/ruta/a/palomas.png'
duration 1
file '/ruta/a/perros.png'
duration 3
file '/ruta/a/gatos.png'
duration 2

Ten en cuenta que duration esta en segundos, se refiere al file inmediato anterior y puedes usar valores decimales (ej: 0.5 que seria medio segundo)

Aqui esta la documentacion del formato concat

3 - Lanzar el proceso (puedes usar shell_exec) para hacer el video:

ffmpeg -f concat -i comandos.txt -pix_fmt yuv420p video.mp4

Donde comandos.txt es el archivo creado en el punto 2, y video.mp4 es el video resultante.

Nota: lo he usado con imágenes del mismo tamaño, de las cuales sale las dimensiones del vídeo (imganes 1920 x 1080 generan un vídeo full HD). Si necesitas re-escalar el vídeo ver aquí.

4 - Agregarle la pista de audio al vídeo (que puedes crear de forma similar, usando un mp3 de salida)

ffmpeg -i video.mp4 -i audio.mp3 output.mp4

Donde video.mp4 es el archivo creado en el punto 3, audio.mp3 es el audio a agregar y output.mp4 es el resultado final.

Mas información

Te dejo estas referencia que son para mi la guia de trabajo con ffmpeg.

rnrneverdies
  • 16,491
  • 3
  • 49
  • 79