>> Tecnologia Eletrônica >  >> Áudio Pessoal >> Reprodutores MP3

Converter MP3 para MP4 com PHP e FFmpeg (Exemplo de Código)

Usando o wrapper PHP spatie/ffmpeg (pacote Composer) para controlo limpo e orientado a objetos do FFmpeg.

Pré-requisitos

  • PHP 8.0+
  • Composer
  • FFmpeg instalado no servidor (ffmpeg -version funciona na CLI).
  • Pacote Composer: composer require spatie/ffmpeg

Script Básico de Conversão

<?php require 'vendor/autoload.php'; use Spatie\Ffmpeg\Ffmpeg; use Spatie\Ffmpeg\Exception\ConversionFailedException; try { $ffmpeg = Ffmpeg::create(); $output = $ffmpeg->input('/path/to/input.mp3') ->output('/path/to/output.mp4') ->addArguments(['-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'aac', '-b:a', '192k', '-pix_fmt', 'yuv420p', '-shortest']) ->convert(); echo "Conversão bem-sucedida. Saída: {$output->getPathname()}"; } catch (ConversionFailedException $e) { echo "Conversão falhou: {$e->getMessage()}"; // $e->getCommand() para debug } ?> 

Argumentos-Chave Explicados

  • -c:v libx264: Codifica vídeo como H.264 (padrão MP4).
  • -tune stillimage: Otimiza para imagem estática (capa de álbum) — ficheiro minúsculo, codificação rápida.
  • -c:a aac -b:a 192k: Re-codifica áudio para AAC 192 kbps (padrão MP4).
  • -pix_fmt yuv420p: Garante ampla compatibilidade de players.
  • -shortest: Para quando o stream mais curto termina (áudio).

Adicionar Capa de Álbum (Faixa de Vídeo)

$ffmpeg->input('/path/to/input.mp3') ->input('/path/to/cover.jpg') ->output('/path/to/output.mp4') ->addArguments([ '-map', '0:a', '-map', '1:v', '-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'copy', // manter áudio original '-pix_fmt', 'yuv420p', '-shortest', '-disposition:v', 'attached_pic' // marca como capa ]) ->convert(); 

Considerações para Produção

  • Validar caminhos: Garantir que input existe, diretório de output tem escrita.
  • Timeouts: Definir max_execution_time do PHP ou usar assíncrono (queue/worker).
  • Segurança: Sanitizar nomes de ficheiros; nunca passar input do utilizador diretamente para shell.
  • Limites de recursos: FFmpeg usa CPU/RAM; monitorar em hosting partilhado.
  • Tratamento de erros: Capturar ConversionFailedException; registar $e->getCommand().

Alternativa: Symfony Process (Sem Wrapper)

use Symfony\Component\Process\Process; $process = new Process([ 'ffmpeg', '-y', '-i', '/path/to/input.mp3', '-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'aac', '-b:a', '192k', '-pix_fmt', 'yuv420p', '-shortest', '/path/to/output.mp4' ]); $process->mustRun(); // lança exceção em falha 

Use o wrapper para manutenibilidade; Process bruto para microsserviços sem dependências.