import gradio as gr from moviepy.editor import VideoFileClip, concatenate_videoclips from moviepy.video.fx import speedx import random import os # Función para procesar los videos y generar una vista previa def previsualizar_videos(videos, rotations, speeds): previews = [] for idx, video_path in enumerate(videos): try: # Procesar el video sin cortar por ahora, solo para la vista previa clip = VideoFileClip(video_path) # Aplicar la rotación seleccionada por el usuario para cada video if rotations[idx] == "90 grados": clip = clip.rotate(90) elif rotations[idx] == "180 grados": clip = clip.rotate(180) elif rotations[idx] == "270 grados": clip = clip.rotate(270) # Aplicar la velocidad seleccionada por el usuario para cada video clip = speedx(clip, factor=speeds[idx]) # Generar la vista previa preview_output = f"preview_{idx}.mp4" clip.write_videofile(preview_output, codec="libx264", audio_codec="aac", preset="ultrafast", threads=4) previews.append(preview_output) except Exception as e: previews.append(f"Error al procesar el video {idx+1}: {str(e)}") return previews # Función para generar el video final en formato 9:16 def generar_video_final(videos, rotations, speeds, song): clips = [] # Procesar cada video cargado for idx, video_path in enumerate(videos): try: # Procesar el video y cortar los primeros 2 segundos clip = VideoFileClip(video_path).subclip(2) # Aplicar la rotación seleccionada por el usuario para cada video if rotations[idx] == "90 grados": clip = clip.rotate(90) elif rotations[idx] == "180 grados": clip = clip.rotate(180) elif rotations[idx] == "270 grados": clip = clip.rotate(270) # Aplicar la velocidad seleccionada clip = speedx(clip, factor=speeds[idx]) # Cambiar a 9:16 si es necesario clip = clip.resize(height=1080) clips.append(clip) except Exception as e: return None, f"Error al procesar el video {idx+1}: {str(e)}" # Mezclar los clips en orden aleatorio random.shuffle(clips) # Unir los clips try: final_clip = concatenate_videoclips(clips) # Añadir la canción si se ha subido if song: song_audio = AudioFileClip(song).subclip(0, final_clip.duration) final_clip = final_clip.set_audio(song_audio) # Guardar el video final output_path = "video_final.mp4" final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", preset="ultrafast", threads=4) return output_path, None except Exception as e: return None, f"Error al generar el video final: {str(e)}" # Crear la interfaz de Gradio def crear_interfaz(): # Subir múltiples videos a la vez video_inputs = gr.Files(label="Sube todos los videos (MP4, MOV)", file_count="multiple", type="filepath") # Configurar sliders de rotación y velocidad para cada video rotation_input = gr.Radio(["Sin rotación", "90 grados", "180 grados", "270 grados"], label="Rotar videos") speed_input = gr.Slider(minimum=0.5, maximum=2.0, step=0.1, value=1.0, label="Velocidad de reproducción") demo = gr.Interface( fn=previsualizar_videos, inputs=[video_inputs, rotation_input, speed_input], outputs=[gr.Video(label="Previsualiza tus videos procesados")], title="Previsualizar y Ajustar Rotación y Velocidad", description="Sube todos los videos a la vez, ajusta la rotación y la velocidad para cada uno, y previsualiza antes de generar el video final.", ) # Interfaz para generar el video final final_demo = gr.Interface( fn=generar_video_final, inputs=[video_inputs, rotation_input, speed_input, gr.Audio(label="Sube una canción opcional")], outputs=[gr.Video(label="Previsualización del video final"), gr.File(label="Descargar video final")], title="Generar Video Final con Velocidad y Rotación", description="Sube todos los videos a la vez, ajusta la rotación y velocidad, y combina los clips con una canción para obtener el video final en formato 9:16.", ) demo.launch(share=True) final_demo.launch(share=True) # Ejecutar la interfaz crear_interfaz()