BotBeta
Admin
Sigma
Verificado
Verificación en dos pasos activada
¡Usuario popular!
Suscripción a IA
El error "No such file or directory" que estás viendo al intentar ejecutar el comando para convertir a H.265 sugiere que el archivo de entrada (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/' . $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:01.000 -vframes 1 " . escapeshellarg($preview_path);
shell_exec($command_preview . " > /dev/null 2>&1 &"); // Ejecutar el comando FFmpeg para vista previa
// Comando para convertir a H.265
$h265_path = 'upload/compressed_' . $base_name . '.mp4'; // Ruta para video en H.265
$command_to_h265 = "ffmpeg -i " . escapeshellarg($target_path) . " -vcodec libx265 -crf 35 " . escapeshellarg($h265_path);
shell_exec($command_to_h265); // Ejecutar el comando FFmpeg para comprimir en H.265
// Comando para convertir el H.265 a H.264 y comprimir
$compressed_path = 'upload/compressed' . $base_name . '.mp4'; // Ruta para video comprimido en H.264
$command_to_h264 = "ffmpeg -i " . escapeshellarg($h265_path) . " -vcodec libx264 -crf 28 " . escapeshellarg($compressed_path);
exec($command_to_h264 . " > /dev/null 2> error_log2.txt &"); // Ejecutar el comando FFmpeg para comprimir en H.264
// Borrar el video en H.265
// 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
}
}
}
}
}
porque no puedo mandar en 2do plano el comando para convertir h265?
cuando lo intento me sale este error
upload/compressed_73f9bf3848fe13631913522b82.mp4: No such file or directory
$target_path) no está disponible o que hay un problema de referencia en el momento en que el comando se ejecuta. Esto puede deberse a que el primer proceso de FFmpeg aún no ha terminado de ejecutar y, por lo tanto, el archivo en H.265 no se genera antes de intentar usarlo.### Soluciones Para Ejecutar Comandos en Segundo Plano
1. Usar
wait: Puedes usar wait para asegurarte de que el primer proceso haya terminado antes de ejecutar el siguiente. Esto requiere que los procesos estén en segundo plano. Sin embargo, esto puede ser complicado si no manejas correctamente el PID de los procesos.2. Utiliza el comando en el mismo proceso: En vez de lanzar en segundo plano, asegúrate de que el proceso de conversión esté completo antes de iniciar el siguiente comando. Puedes hacerlo directamente, sin el
& al final del comando.3. Comprobar la existencia del archivo: Antes de intentar acceder al archivo de salida, verifica que el archivo se haya creado exitosamente. Puedes hacer esto usando una pequeña función que verifique el archivo antes de proceder.
4. Uso de
proc_open(): Otra opción es usar proc_open() para manejo más complejo de procesos en segundo plano y poder capturar errores de manera más efectiva.### Ejemplo de Código Ajustado
Aquí hay una forma de ajustar tu código para asegurarte de que el primer comando haya terminado antes de ejecutar el segundo:
PHP:
if ($fileType === "video/mp4") {
if (is_uploaded_file($tmp_name)) {
$base_name = mt_rand(1, 100) . bin2hex(random_bytes(mt_rand(5, 15)));
$target_path = 'upload/' . $base_name . '.mp4';
if (move_uploaded_file($tmp_name, $target_path)) {
// Crear un preview del video
$preview_path = 'imguser/compressed' . $base_name . '.webp';
$command_preview = "ffmpeg -i " . escapeshellarg($target_path) . " -ss 00:00:01.000 -vframes 1 " . escapeshellarg($preview_path);
shell_exec($command_preview . " > /dev/null 2>&1");
// Comando para convertir a H.265
$h265_path = 'upload/compressed_' . $base_name . '.mp4';
$command_to_h265 = "ffmpeg -i " . escapeshellarg($target_path) . " -vcodec libx265 -crf 35 " . escapeshellarg($h265_path);
exec($command_to_h265); // Ejecutar el comando FFmpeg para comprimir en H.265
// Verificar si H.265 fue creado antes de continuar
if (file_exists($h265_path)) {
// Comando para convertir el H.265 a H.264 y comprimir
$compressed_path = 'upload/compressed_' . $base_name . '.mp4';
$command_to_h264 = "ffmpeg -i " . escapeshellarg($h265_path) . " -vcodec libx264 -crf 28 " . escapeshellarg($compressed_path);
exec($command_to_h264 . " > /dev/null 2> error_log2.txt"); // Ejecutar el comando FFmpeg para comprimir en H.264
} else {
error_log("Error: El archivo H.265 no se creó.");
}
// Manejo de categorías
if ($_POST['category'] === "livs") {
$uploaded_files[0] = $compressed_path;
break;
} else {
if (count($uploaded_files) < 20) {
$uploaded_files[] = $compressed_path;
}
}
}
}
}
### Recomendaciones Adicionales
- Verificar Errores: Usa
error_get_last() o revisa error_log para capturar mensajes de error si algo falla al ejecutar los comandos de FFmpeg.- Tiempos de Ejecución: Si tus procesos están tardando mucho, considera ajustar el tiempo de espera en PHP y Apache, como ya hemos discutido.
Con estas modificaciones, deberías poder resolver el problema y procesar tus archivos de video correctamente.

