o / app.py
Merlintxu's picture
Upload 2 files
c4a2319 verified
raw
history blame
2.84 kB
import gradio as gr
from moviepy.editor import VideoFileClip
import os
# Función para obtener duración del vídeo
def get_video_duration(video_path):
clip = VideoFileClip(video_path)
duration = clip.duration
clip.close()
return duration
# Función para cortar y redimensionar el vídeo
def edit_video(video_file, start_time, end_time, resolution):
if video_file is None:
return "Sube un vídeo primero.", None
input_path = video_file.name
clip = VideoFileClip(input_path)
# Asegurar que los tiempos son válidos
if start_time < 0 or end_time > clip.duration or start_time >= end_time:
clip.close()
return "Tiempos inválidos. Asegúrate de elegir un rango correcto.", None
# Cortar el clip según tiempos proporcionados
edited_clip = clip.subclip(start_time, end_time)
# Definir resoluciones estándar
resolutions = {
"480p": (854, 480),
"720p": (1280, 720),
"1080p": (1920, 1080),
"1440p": (2560, 1440),
"4K": (3840, 2160)
}
# Redimensionar el vídeo manteniendo aspecto original
target_resolution = resolutions[resolution]
edited_clip = edited_clip.resize(height=target_resolution[1])
# Guardar resultado
output_filename = f"edited_{resolution}_{os.path.basename(input_path)}"
edited_clip.write_videofile(output_filename, codec="libx264", audio_codec="aac")
edited_clip.close()
clip.close()
return "Vídeo editado correctamente.", output_filename
# Interfaz de Gradio
with gr.Blocks() as demo:
gr.Markdown("# 🎬 Editor de Vídeos Interactivo")
video_input = gr.File(label="Sube tu vídeo aquí", file_types=["video"])
duration_display = gr.Textbox(label="Duración del vídeo (segundos)", interactive=False)
with gr.Row():
start_time = gr.Number(label="Tiempo inicial (segundos)", value=0)
end_time = gr.Number(label="Tiempo final (segundos)", value=10)
resolution = gr.Dropdown(label="Resolución de exportación",
choices=["480p", "720p", "1080p", "1440p", "4K"],
value="1080p")
edit_button = gr.Button("Editar Vídeo")
status_display = gr.Textbox(label="Estado", interactive=False)
video_output = gr.Video(label="Vídeo editado")
# Actualizar duración cuando se sube un vídeo
def update_duration(video):
if video is not None:
duration = get_video_duration(video.name)
return duration
return ""
video_input.change(fn=update_duration, inputs=video_input, outputs=duration_display)
# Editar vídeo al pulsar el botón
edit_button.click(
fn=edit_video,
inputs=[video_input, start_time, end_time, resolution],
outputs=[status_display, video_output]
)
demo.launch()