up
This commit is contained in:
+32
-18
@@ -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.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user