GAS17 commited on
Commit
391170d
verified
1 Parent(s): f005c80

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -61
app.py CHANGED
@@ -1,51 +1,62 @@
1
  import gradio as gr
2
- from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip
3
- from moviepy.audio.fx.all import audio_fadeout
4
  import random
5
- import subprocess
6
  import os
7
 
8
- # Funci贸n para convertir MOV a MP4
9
- def convertir_mov_a_mp4(ruta_mov):
10
- ruta_mp4 = ruta_mov.replace('.MOV', '.mp4')
11
- subprocess.run(['ffmpeg', '-i', ruta_mov, '-vcodec', 'h264', '-acodec', 'aac', ruta_mp4], check=True)
12
- return ruta_mp4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- # Funci贸n para procesar los videos
15
- def process_videos(videos, rotate_option, song):
16
  clips = []
17
- errores = [] # Para almacenar los videos que no se pudieron procesar
18
 
19
  # Procesar cada video cargado
20
- for video_path in videos:
21
  try:
22
- if video_path.endswith('.MOV'):
23
- # Convertir MOV a MP4
24
- video_path = convertir_mov_a_mp4(video_path)
25
- if video_path.endswith(('.mp4')):
26
- clip = VideoFileClip(video_path).without_audio() # Eliminar el audio original del video
 
 
 
 
 
27
 
28
- # Recortar el video a los primeros 3 segundos
29
- if clip.duration > 3:
30
- clip = clip.subclip(0, 3)
31
 
32
- # Aplicar la rotaci贸n seg煤n la opci贸n seleccionada
33
- if rotate_option == "90 grados":
34
- clip = clip.rotate(90)
35
- elif rotate_option == "180 grados":
36
- clip = clip.rotate(180)
37
- elif rotate_option == "270 grados":
38
- clip = clip.rotate(270)
39
-
40
- clips.append(clip)
41
- else:
42
- errores.append(f"Archivo no compatible: {video_path}")
43
  except Exception as e:
44
- errores.append(f"Error al procesar {video_path}: {str(e)}")
45
-
46
- # Si no se proces贸 ning煤n video, mostrar los errores
47
- if len(clips) == 0:
48
- return None, None # Devolver None para ambas salidas si hay errores
49
 
50
  # Mezclar los clips en orden aleatorio
51
  random.shuffle(clips)
@@ -54,37 +65,44 @@ def process_videos(videos, rotate_option, song):
54
  try:
55
  final_clip = concatenate_videoclips(clips)
56
 
57
- # A帽adir la canci贸n y hacer que termine con un fade out
58
  if song:
59
- song_audio = AudioFileClip(song)
60
- song_audio = song_audio.subclip(0, final_clip.duration)
61
- song_audio = audio_fadeout(song_audio, 3) # A帽adir fade out de 3 segundos al final de la canci贸n
62
  final_clip = final_clip.set_audio(song_audio)
63
 
64
- # Guardar el video resultante
65
- output_path = "output_video.mp4"
66
- final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
67
 
68
- # Devolver la ruta del video para previsualizaci贸n y descarga
69
- return output_path, output_path
70
  except Exception as e:
71
- return None, None # Devolver None en caso de errores
72
 
73
  # Crear la interfaz de Gradio
74
- demo = gr.Interface(
75
- fn=process_videos,
76
- inputs=[
77
- gr.Files(label="Sube tus videos (MP4, MOV)", file_count="multiple", type="filepath"),
78
- gr.Radio(["Sin rotaci贸n", "90 grados", "180 grados", "270 grados"], label="Rotar video"),
79
- gr.Audio(label="Sube una canci贸n", type="filepath") # A帽adir un campo para subir la canci贸n
80
- ],
81
- outputs=[
82
- gr.Video(label="Previsualiza tu video procesado"), # Para mostrar el video en un reproductor
83
- gr.File(label="Descargar video procesado") # Para permitir la descarga del video final
84
- ],
85
- title="Mezclar y Unir Videos con Rotaci贸n y M煤sica",
86
- description="Sube varios videos, rec贸rtalos, m茅zclalos, reemplaza el audio con una canci贸n y aplica una rotaci贸n.",
87
- )
 
 
 
 
 
 
 
 
 
 
88
 
89
  # Ejecutar la interfaz
90
- demo.launch(share=True)
 
1
  import gradio as gr
2
+ from moviepy.editor import VideoFileClip, concatenate_videoclips
3
+ from moviepy.video.fx import speedx
4
  import random
 
5
  import os
6
 
7
+ # Funci贸n para procesar los videos y generar una vista previa
8
+ def previsualizar_videos(videos, rotations, speeds):
9
+ previews = []
10
+ for idx, video_path in enumerate(videos):
11
+ try:
12
+ # Procesar el video sin cortar por ahora, solo para la vista previa
13
+ clip = VideoFileClip(video_path)
14
+
15
+ # Aplicar la rotaci贸n seleccionada por el usuario para cada video
16
+ if rotations[idx] == "90 grados":
17
+ clip = clip.rotate(90)
18
+ elif rotations[idx] == "180 grados":
19
+ clip = clip.rotate(180)
20
+ elif rotations[idx] == "270 grados":
21
+ clip = clip.rotate(270)
22
+
23
+ # Aplicar la velocidad seleccionada por el usuario para cada video
24
+ clip = speedx(clip, factor=speeds[idx])
25
+
26
+ # Generar la vista previa
27
+ preview_output = f"preview_{idx}.mp4"
28
+ clip.write_videofile(preview_output, codec="libx264", audio_codec="aac", preset="ultrafast", threads=4)
29
+ previews.append(preview_output)
30
+ except Exception as e:
31
+ previews.append(f"Error al procesar el video {idx+1}: {str(e)}")
32
+ return previews
33
 
34
+ # Funci贸n para generar el video final en formato 9:16
35
+ def generar_video_final(videos, rotations, speeds, song):
36
  clips = []
 
37
 
38
  # Procesar cada video cargado
39
+ for idx, video_path in enumerate(videos):
40
  try:
41
+ # Procesar el video y cortar los primeros 2 segundos
42
+ clip = VideoFileClip(video_path).subclip(2)
43
+
44
+ # Aplicar la rotaci贸n seleccionada por el usuario para cada video
45
+ if rotations[idx] == "90 grados":
46
+ clip = clip.rotate(90)
47
+ elif rotations[idx] == "180 grados":
48
+ clip = clip.rotate(180)
49
+ elif rotations[idx] == "270 grados":
50
+ clip = clip.rotate(270)
51
 
52
+ # Aplicar la velocidad seleccionada
53
+ clip = speedx(clip, factor=speeds[idx])
 
54
 
55
+ # Cambiar a 9:16 si es necesario
56
+ clip = clip.resize(height=1080)
57
+ clips.append(clip)
 
 
 
 
 
 
 
 
58
  except Exception as e:
59
+ return None, f"Error al procesar el video {idx+1}: {str(e)}"
 
 
 
 
60
 
61
  # Mezclar los clips en orden aleatorio
62
  random.shuffle(clips)
 
65
  try:
66
  final_clip = concatenate_videoclips(clips)
67
 
68
+ # A帽adir la canci贸n si se ha subido
69
  if song:
70
+ song_audio = AudioFileClip(song).subclip(0, final_clip.duration)
 
 
71
  final_clip = final_clip.set_audio(song_audio)
72
 
73
+ # Guardar el video final
74
+ output_path = "video_final.mp4"
75
+ final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", preset="ultrafast", threads=4)
76
 
77
+ return output_path, None
 
78
  except Exception as e:
79
+ return None, f"Error al generar el video final: {str(e)}"
80
 
81
  # Crear la interfaz de Gradio
82
+ def crear_interfaz():
83
+ video_inputs = [gr.Video(label=f"Sube el video {i+1}") for i in range(5)]
84
+ rotation_inputs = [gr.Radio(["Sin rotaci贸n", "90 grados", "180 grados", "270 grados"], label=f"Rotar video {i+1}") for i in range(5)]
85
+ speed_inputs = [gr.Slider(minimum=0.5, maximum=2.0, step=0.1, value=1.0, label=f"Velocidad video {i+1}") for i in range(5)]
86
+
87
+ demo = gr.Interface(
88
+ fn=previsualizar_videos,
89
+ inputs=video_inputs + rotation_inputs + speed_inputs,
90
+ outputs=[gr.Video(label=f"Vista previa {i+1}") for i in range(5)],
91
+ title="Previsualizar y Rotar Videos con Velocidad",
92
+ description="Sube tus videos, ajusta la rotaci贸n y velocidad si es necesario, y previsualiza cada uno antes de generar el video final.",
93
+ )
94
+
95
+ # Interfaz para generar el video final
96
+ final_demo = gr.Interface(
97
+ fn=generar_video_final,
98
+ inputs=video_inputs + rotation_inputs + speed_inputs + [gr.Audio(label="Sube una canci贸n opcional")],
99
+ outputs=[gr.Video(label="Previsualizaci贸n del video final"), gr.File(label="Descargar video final")],
100
+ title="Generar Video Final con Velocidad y Rotaci贸n",
101
+ description="Sube tus videos, ajusta la rotaci贸n y velocidad, y combina los clips con una canci贸n para obtener el video final en formato 9:16.",
102
+ )
103
+
104
+ demo.launch(share=True)
105
+ final_demo.launch(share=True)
106
 
107
  # Ejecutar la interfaz
108
+ crear_interfaz()