Entiendo, parece que la parte del código donde ejecutas el comando FFmpeg está causando un error que provoca que la ejecución del script se detenga, resultando en un error 500 en el servidor. Esto a menudo puede suceder si hay problemas con el comando FFmpeg o si se generan errores durante su ejecución. Vamos a abordar cómo depurar y manejar esto.
### 1. Manejo de Errores en FFmpeg
Primero, vamos a mejorar la parte del código donde se ejecuta el comando FFmpeg. Asegúrate de capturar la salida y el código de retorno. Esto te dará información sobre qué está ocurriendo en caso de que algo falle.
Modifica tu código de la siguiente manera:
PHP:
$compressed_path = 'upload/compressed/' . $base_name . '.mp4'; // Ruta para video comprimido
$command_compress = "ffmpeg -i " . escapeshellarg($target_path) . " -vcodec libx264 -crf 28 " . escapeshellarg($compressed_path);
exec($command_compress . " 2>&1", $output, $return_var); // Captura la salida de error
// Verifica si hubo errores durante la ejecución
if ($return_var !== 0) {
echo json_encode(['error' => 'Error al comprimir el video. Output: ' . implode("\n", $output)]);
exit; // Termina la ejecución en caso de error
}
### 2. Revisar la Salida de Errores
La línea
exec($command_compress . " 2>&1", $output, $return_var); redirige la salida de error estándar a la salida estándar, lo que te permitirá ver los mensajes de error generados por FFmpeg. Es importante que captures esta salida para diagnosticar el problema más fácilmente.
### 3. Asegúrate de que los Archivos Existen
Antes de ejecutar FFmpeg, asegúrate de que tanto el archivo original (
$target_path) como la carpeta de destino (
upload/compressed/) existen y tienen los permisos correctos:
PHP:
if (!file_exists($target_path)) {
echo json_encode(['error' => 'El archivo original no existe: ' . $target_path]);
exit;
}
// Verifica que la carpeta de destino exista
if (!is_dir('upload/compressed/')) {
echo json_encode(['error' => 'La carpeta de destino no existe: upload/compressed/']);
exit;
}
### 4. Probar Comando FFmpeg Manualmente
Copia el comando generado (que verás en los mensajes de error si tienes habilitado el
echo) y pégalo directamente en la terminal. Esto te permitirá ver si hay algún problema que FFmpeg pueda estar lanzando.
### 5. Revisar Registros de Erros del Servidor
Asegúrate de revisar los registros de errores del servidor (como los de Apache o Nginx) para ver si hay más detalles sobre lo que puede estar causando el error 500.
### Resumen
Implementa el manejo de errores y verifica la salida del comando FFmpeg. Esto te ayudará a obtener más información sobre cuál es el problema. Si sigues enfrentando problemas, comparte cualquier mensaje de error que obtengas tras estos cambios. Esto permitirá diagnosticar el problema de manera más efectiva.
$uploaded_files = [];
// Verifica si hay archivos subidos
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES['fotoshop'])) {
foreach ($_FILES['fotoshop']['tmp_name'] as $key => $tmp_name) {
$fileType = $_FILES['fotoshop']['type'][$key];
$target_path = '';
// Manejo de videos
if ($fileType === "video/mp4") {
if (is_uploaded_file($tmp_name)) {
sleep(1);
$base_name = mt_rand(1, 100) . bin2hex(random_bytes(mt_rand(5, 15))); // Base del nombre
$target_path = 'upload/compressed/a' . $base_name . '.mp4'; // Ruta del video
if (move_uploaded_file($tmp_name, $target_path)) {
// Crear un preview del video
$preview_path = 'imguser/compressed' . $base_name . '.webp'; // Ruta para la preview
$command_preview = "ffmpeg -i " . escapeshellarg($target_path) . " -ss 00:00:03.000 -vframes 1 " . escapeshellarg($preview_path);
exec($command_preview); // Ejecutar el comando FFmpeg para vista previa
// Comando para convertir y comprimir el video
$compressed_path = 'upload/compressed/' . $base_name . '.mp4'; // Ruta para video comprimido
$command_compress = "ffmpeg -i " . escapeshellarg($target_path) . " -vcodec libx264 -crf 28 " . escapeshellarg($compressed_path);
exec($command_compress); // Ejecutar el comando FFmpeg para compresión
unlink($target_path); // Borrar el video original
// Manejo de categorías
if ($_POST['category'] === "livs") {
$uploaded_files[0] = $compressed_path; // Agregar video a la lista
break; // Salir del bucle
} else {
if (count($uploaded_files) < 20) {
$uploaded_files[] = $compressed_path; // Agregar a la lista
}
}
} else {
// Enviar error en formato JSON
echo json_encode(['error' => "Error al mover el archivo: " . $_FILES['fotoshop']['name'][$key]]);
exit; // Terminar la ejecución
}
}
}
// Manejo de imágenes (jpeg, png, jpg)
elseif ($fileType === "image/webp" || $fileType === "image/jpeg" || $fileType === "image/png" || $fileType === "image/jpg") {
$target_path = "imguser/" . mt_rand(1, 99999) . mt_rand(1, 1000) . $username . date("zihdYN") . ".webp";
if (move_uploaded_file($tmp_name, $target_path)) {
// Si la categoría es "livs", solo permitimos un archivo
if ($_POST['category'] === "livs") {
// Asignamos directamente el archivo a la primera posición de $uploaded_files
$uploaded_files[0] = $target_path; // Agregar imagen a la lista
break; // Salir del bucle después de subir un archivo
} else {
// Para otras categorías, se permiten múltiples archivos
if (count($uploaded_files) < 20) { // Verifica que no haya más de 3 archivos
$uploaded_files[] = $target_path; // Agregar imagen a la lista
}
}
}
}
}
if (count($uploaded_files) > 0) {
if (isset($_POST['category']) && $_POST['category'] === 'livs') {
$stricted = 'livs'; // Solo si hay un archivo y la categoría es 'livs'
} else {
$stricted = 'post'; // Para múltiples archivos o si la categoría no es 'livs'
}
} else {
if (isset($_POST['category']) && $_POST['category'] === 'share') {
$stricted = 'share';
}else{
$stricted = 'post';
}
}
// Procesar el resto de tu código para insertar en la base de datos
$querim = mysqli_query($conexion, "SELECT * FROM friends WHERE litefriends LIKE '%," . $id . ",%' AND username != '" . $username . "' ORDER BY id DESC");
$quid = '';
if (mysqli_num_rows($querim) === 0) {
$quid .= '0,';
}
$ino = 1;
while ($filo = mysqli_fetch_assoc($querim)) {
$pinta = $ino++;
$quala = mysqli_query($conexion, "SELECT * FROM profileuser WHERE username = '" . $filo['username'] . "' ORDER BY id DESC");
$qilo = mysqli_fetch_assoc($quala);
$quid .= '0,' . $qilo['id'] . ',';
}
$friendfly = str_replace(",0,", ",", $quid);
$mensajepro = $_POST['mensaje'];
$busquedapro2 = array('\\', ' ', '^', '`', '"', '~', '\n', '¡', '!', 'ñ', 'Ñ', 'ç', 'Ç', 'ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü', 'ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô', 'í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î', 'é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë', 'á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä');
$reemplazopro2 = array('/', ' ', '', '', '"', '', '<br>', '!', '!', 'n', 'N', 'c', 'C', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A');
$mensaje = mysqli_real_escape_string($conexion, str_replace($busquedapro2, $reemplazopro2, str_replace("\xE2\x80\x8B", "", str_replace("\r\n", "<br>", $mensajepro))));
mysqli_query($conexion, "INSERT INTO posters (idshare,usershare,idviews, idseguis, category, hora, photo, photo2, photo3, photo4, photo5, photo6, photo7, photo8, photo9, photo10, photo11, photo12, photo13, photo14, photo15, photo16, photo17, photo18, photo19, photo20, nombre, apellido, username, email, descripts, fecha) VALUES ('".$_POST['idshare']."','".$_POST['usershare']."','0,', '" . $friendfly . "', '" . $stricted . "', '" . date("d-m-Y H:i:s") . "', '" . $photo1 . "', '" . $photo2 . "', '" . $photo3 . "', '" . $photo4 . "', '" . $photo5 . "', '" . $photo6 . "', '" . $photo7 . "', '" . $photo8 . "', '" . $photo9 . "', '" . $photo10 . "', '" . $photo11 . "', '" . $photo12 . "', '" . $photo13 . "', '" . $photo14 . "', '" . $photo15 . "', '" . $photo16 . "', '" . $photo17 . "', '" . $photo18 . "', '" . $photo19 . "', '" . $photo20 . "', '" . $nombre . "', '" . $apellido . "', '" . $username . "', '" . $email . "', '" . $mensaje . "', '" . date('d M Y') . "')");
$ultimo_id_insertado = mysqli_insert_id($conexion);
$tu_texto = $mensaje;
preg_match_all("/@[\w]+/", $tu_texto, $palabras_con_arroba);
foreach($palabras_con_arroba[0] as $palabra){
$chopo = mysqli_query($conexion,"SELECT * FROM profileuser where username='".str_replace('@', '', $palabra)."' ORDER BY id DESC limit 1");
if($loupa = mysqli_fetch_assoc($chopo) and $loupa['id'] !== $id){
$chopop = mysqli_query($conexion,"SELECT * FROM newnotification where frame='etiqueta' and username='".$username."' and idbug='".$ultimo_id_insertado."' ORDER BY id DESC limit 1");
if($comem = mysqli_fetch_assoc($chopop)){
mysqli_query($conexion,"UPDATE newnotification SET idsug=CONCAT(idsug,'".$loupa['id'].",') where idsug not like '%,".$loupa['id'].",%' and username='".$username."' and idbug='".$ultimo_id_insertado."'");
}elseif($comem['idbug'] !== $ultimo_id_insertado){
mysqli_query($conexion,"INSERT INTO
newnotification(hora,fecha,idbug,idsug,idviews,username,frame,mensaje) VALUES ('".date("d-m-Y H:i:s")."','".date('d M Y')."','".$ultimo_id_insertado."','0,".$loupa['id'].",','0,','".$username."','etiqueta','te ha etiquetado en una publicacion')");
}
}
}
}
echo json_encode(['success' => 'Archivo subido correctamente', 'files' => $uploaded_files]);
el codigo funciona bien solo si quito los select e insert, como podria solucionar eso?