This commit is contained in:
Lizandro Guarnizo
2026-01-28 02:23:36 -05:00
parent 37d6bf1e20
commit 6ebf5c9a22
30 changed files with 2264 additions and 118 deletions
+32 -18
View File
@@ -63,9 +63,9 @@ try {
$allowedTypes = [
// Imágenes
'image/jpeg', 'image/jpg', 'image/png', 'image/webp',
// Videos
'video/mp4', 'video/3gpp', 'video/quicktime',
// Audios
// Videos (webm será convertido a mp4)
'video/mp4', 'video/3gpp', 'video/quicktime', 'video/webm',
// Audios (webm será convertido a ogg)
'audio/aac', 'audio/mp3', 'audio/mpeg', 'audio/ogg', 'audio/amr', 'audio/webm',
// Documentos
'application/pdf',
@@ -97,38 +97,52 @@ try {
throw new Exception('Error al guardar el archivo en el servidor');
}
// Si es audio WebM, intentar convertir a OGG/Opus (formatos más compatibles con WhatsApp)
// Convertir archivos WebM (audio y video) a formatos compatibles con WhatsApp
$converted = false;
$conversion_error = null;
if (strpos($fileType, 'audio/webm') === 0) {
if (strpos($fileType, 'audio/webm') === 0 || strpos($fileType, 'video/webm') === 0) {
// Evitar fatal si shell_exec está deshabilitado en el hosting
if (function_exists('shell_exec')) {
$ffmpeg = trim(@shell_exec('which ffmpeg 2>/dev/null'));
if ($ffmpeg) {
try {
$convertedName = uniqid('media_', true) . '.ogg';
$convertedPath = $uploadDir . $convertedName;
// Convertir a Opus (bitrate moderado). Forzamos formato OGG, mono 48kHz y mapeamos la primera pista de audio.
// Esto ayuda a evitar contenedores/streams extra que pueden causar que el archivo suene como ruido.
$cmd = escapeshellcmd($ffmpeg) . ' -y -i ' . escapeshellarg($uploadPath) . ' -map 0:a:0 -c:a libopus -b:a 64k -vbr on -ar 48000 -ac 1 -f ogg ' . escapeshellarg($convertedPath) . ' 2>&1';
if (strpos($fileType, 'audio/webm') === 0) {
// Audio WebM -> OGG/Opus
$convertedName = uniqid('media_', true) . '.ogg';
$convertedPath = $uploadDir . $convertedName;
// Convertir a Opus (bitrate moderado). Forzamos formato OGG, mono 48kHz y mapeamos la primera pista de audio.
$cmd = escapeshellcmd($ffmpeg) . ' -y -i ' . escapeshellarg($uploadPath) . ' -map 0:a:0 -c:a libopus -b:a 64k -vbr on -ar 48000 -ac 1 -f ogg ' . escapeshellarg($convertedPath) . ' 2>&1';
$newType = 'audio/ogg';
$logType = 'Audio';
} else {
// Video WebM -> MP4
$convertedName = uniqid('media_', true) . '.mp4';
$convertedPath = $uploadDir . $convertedName;
// Convertir a MP4 con H.264 (compatible con WhatsApp)
$cmd = escapeshellcmd($ffmpeg) . ' -y -i ' . escapeshellarg($uploadPath) . ' -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k -movflags +faststart ' . escapeshellarg($convertedPath) . ' 2>&1';
$newType = 'video/mp4';
$logType = 'Video';
}
$out = @shell_exec($cmd);
// Añadir comprobación diagnóstica con "ffmpeg -i" sobre el archivo convertido para registrar detalles del stream
// Añadir comprobación diagnóstica con "ffmpeg -i" sobre el archivo convertido
$probe = @shell_exec(escapeshellcmd($ffmpeg) . ' -i ' . escapeshellarg($convertedPath) . ' 2>&1');
if (file_exists($convertedPath) && filesize($convertedPath) > 0) {
// Reemplazar archivo original por el convertido
@unlink($uploadPath);
$uploadPath = $convertedPath;
$uniqueName = $convertedName;
$fileType = 'audio/ogg';
$fileType = $newType;
$converted = true;
error_log('upload_media.php - Audio convertido a OGG/Opus: ' . $convertedName);
error_log("upload_media.php - $logType convertido: $convertedName");
error_log('upload_media.php - ffmpeg output: ' . substr($out ?: '', 0, 2000));
error_log('upload_media.php - ffmpeg probe:
' . substr($probe ?: '', 0, 2000));
error_log('upload_media.php - ffmpeg probe: ' . substr($probe ?: '', 0, 2000));
} else {
$conversion_error = 'Conversion failed or no output';
error_log('upload_media.php - Falló conversión con ffmpeg. Output: ' . substr($out ?: '', 0, 2000));
error_log('upload_media.php - ffmpeg probe after failure:\n' . substr($probe ?: '', 0, 2000));
error_log('upload_media.php - ffmpeg probe after failure: ' . substr($probe ?: '', 0, 2000));
}
} catch (Exception $ex) {
$conversion_error = 'Conversion exception: ' . $ex->getMessage();
@@ -136,11 +150,11 @@ try {
}
} else {
$conversion_error = 'ffmpeg not found';
error_log('upload_media.php - ffmpeg no encontrado, no se puede convertir audio/webm.');
error_log('upload_media.php - ffmpeg no encontrado, no se puede convertir webm.');
}
} else {
$conversion_error = 'shell_exec disabled';
error_log('upload_media.php - shell_exec disabled, no se puede convertir audio/webm.');
error_log('upload_media.php - shell_exec disabled, no se puede convertir webm.');
}
}