o
File size: 2,840 Bytes
c4a2319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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()