File size: 3,625 Bytes
edf0e5c
116c4b0
 
edf0e5c
584534d
f7581e4
edf0e5c
584534d
 
 
 
 
 
edf0e5c
f005c80
edf0e5c
f7581e4
edf0e5c
ea09e5d
f005c80
f3f4da7
584534d
 
 
 
f005c80
f3f4da7
f005c80
 
 
 
 
 
f3f4da7
f005c80
f3f4da7
f005c80
f3f4da7
 
 
 
f7581e4
f3f4da7
f7581e4
f3f4da7
f7581e4
f3f4da7
f005c80
edf0e5c
 
 
 
ea09e5d
f3f4da7
 
116c4b0
 
 
 
 
 
 
 
f3f4da7
 
116c4b0
f3f4da7
f005c80
 
f3f4da7
f005c80
edf0e5c
 
ea09e5d
edf0e5c
f005c80
 
 
 
 
116c4b0
 
 
edf0e5c
116c4b0
f005c80
edf0e5c
 
 
f3f4da7
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
87
88
89
90
91
import gradio as gr
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip
from moviepy.audio.fx.all import audio_fadeout
import random
import subprocess
import os

# Funci贸n para convertir MOV a MP4
def convertir_mov_a_mp4(ruta_mov):
    ruta_mp4 = ruta_mov.replace('.MOV', '.mp4')
    subprocess.run(['ffmpeg', '-i', ruta_mov, '-vcodec', 'h264', '-acodec', 'aac', ruta_mp4], check=True)
    return ruta_mp4

# Funci贸n para procesar los videos
def process_videos(videos, rotate_option, song):
    clips = []
    errores = []  # Para almacenar los videos que no se pudieron procesar
    
    # Procesar cada video cargado
    for video_path in videos:
        try:
            if video_path.endswith('.MOV'):
                # Convertir MOV a MP4
                video_path = convertir_mov_a_mp4(video_path)
            if video_path.endswith(('.mp4')):
                clip = VideoFileClip(video_path).without_audio()  # Eliminar el audio original del video

                # Recortar el video a los primeros 3 segundos
                if clip.duration > 3:
                    clip = clip.subclip(0, 3)

                # Aplicar la rotaci贸n seg煤n la opci贸n seleccionada
                if rotate_option == "90 grados":
                    clip = clip.rotate(90)
                elif rotate_option == "180 grados":
                    clip = clip.rotate(180)
                elif rotate_option == "270 grados":
                    clip = clip.rotate(270)

                clips.append(clip)
            else:
                errores.append(f"Archivo no compatible: {video_path}")
        except Exception as e:
            errores.append(f"Error al procesar {video_path}: {str(e)}")
    
    # Si no se proces贸 ning煤n video, mostrar los errores
    if len(clips) == 0:
        return None, None  # Devolver None para ambas salidas si hay errores
    
    # Mezclar los clips en orden aleatorio
    random.shuffle(clips)
    
    # Unir los clips
    try:
        final_clip = concatenate_videoclips(clips)

        # A帽adir la canci贸n y hacer que termine con un fade out
        if song:
            song_audio = AudioFileClip(song)
            song_audio = song_audio.subclip(0, final_clip.duration)
            song_audio = audio_fadeout(song_audio, 3)  # A帽adir fade out de 3 segundos al final de la canci贸n
            final_clip = final_clip.set_audio(song_audio)

        # Guardar el video resultante
        output_path = "output_video.mp4"
        final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
        
        # Devolver la ruta del video para previsualizaci贸n y descarga
        return output_path, output_path
    except Exception as e:
        return None, None  # Devolver None en caso de errores

# Crear la interfaz de Gradio
demo = gr.Interface(
    fn=process_videos,
    inputs=[
        gr.Files(label="Sube tus videos (MP4, MOV)", file_count="multiple", type="filepath"),
        gr.Radio(["Sin rotaci贸n", "90 grados", "180 grados", "270 grados"], label="Rotar video"),
        gr.Audio(label="Sube una canci贸n", type="filepath")  # A帽adir un campo para subir la canci贸n
    ],
    outputs=[
        gr.Video(label="Previsualiza tu video procesado"),  # Para mostrar el video en un reproductor
        gr.File(label="Descargar video procesado")  # Para permitir la descarga del video final
    ],
    title="Mezclar y Unir Videos con Rotaci贸n y M煤sica",
    description="Sube varios videos, rec贸rtalos, m茅zclalos, reemplaza el audio con una canci贸n y aplica una rotaci贸n.",
)

# Ejecutar la interfaz
demo.launch(share=True)