GAS17 commited on
Commit
663f236
verified
1 Parent(s): cc542cc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -80
app.py CHANGED
@@ -1,62 +1,47 @@
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,47 +50,35 @@ def generar_video_final(videos, rotations, speeds, song):
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
- # Subir m煤ltiples videos a la vez
84
- video_inputs = gr.Files(label="Sube todos los videos (MP4, MOV)", file_count="multiple", type="filepath")
85
-
86
- # Configurar sliders de rotaci贸n y velocidad para cada video
87
- rotation_input = gr.Radio(["Sin rotaci贸n", "90 grados", "180 grados", "270 grados"], label="Rotar videos")
88
- speed_input = gr.Slider(minimum=0.5, maximum=2.0, step=0.1, value=1.0, label="Velocidad de reproducci贸n")
89
-
90
- demo = gr.Interface(
91
- fn=previsualizar_videos,
92
- inputs=[video_inputs, rotation_input, speed_input],
93
- outputs=[gr.Video(label="Previsualiza tus videos procesados")],
94
- title="Previsualizar y Ajustar Rotaci贸n y Velocidad",
95
- 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.",
96
- )
97
-
98
- # Interfaz para generar el video final
99
- final_demo = gr.Interface(
100
- fn=generar_video_final,
101
- inputs=[video_inputs, rotation_input, speed_input, gr.Audio(label="Sube una canci贸n opcional")],
102
- outputs=[gr.Video(label="Previsualizaci贸n del video final"), gr.File(label="Descargar video final")],
103
- title="Generar Video Final con Velocidad y Rotaci贸n",
104
- 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.",
105
- )
106
 
107
- demo.launch(share=True)
108
- final_demo.launch(share=True)
 
 
 
 
 
 
 
 
109
 
110
  # Ejecutar la interfaz
111
- crear_interfaz()
 
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, rotations, song):
16
  clips = []
17
+ errores = [] # Para almacenar los videos que no se pudieron procesar
18
 
19
  # Procesar cada video cargado
20
  for idx, video_path in enumerate(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).subclip(2) # Cortar los primeros 2 segundos
 
 
 
 
 
27
 
28
+ # Aplicar la rotaci贸n seleccionada por el usuario para cada video
29
+ if rotations[idx] == "90 grados":
30
+ clip = clip.rotate(90)
31
+ elif rotations[idx] == "180 grados":
32
+ clip = clip.rotate(180)
33
+ elif rotations[idx] == "270 grados":
34
+ clip = clip.rotate(270)
35
 
36
+ clips.append(clip)
37
+ else:
38
+ errores.append(f"Archivo no compatible: {video_path}")
39
  except Exception as e:
40
+ errores.append(f"Error al procesar {video_path}: {str(e)}")
41
+
42
+ # Si no se proces贸 ning煤n video, mostrar los errores
43
+ if len(clips) == 0:
44
+ return None, f"No se pudieron procesar los videos. Errores: {', '.join(errores)}"
45
 
46
  # Mezclar los clips en orden aleatorio
47
  random.shuffle(clips)
 
50
  try:
51
  final_clip = concatenate_videoclips(clips)
52
 
53
+ # A帽adir la canci贸n y hacer que termine con un fade out
54
  if song:
55
+ song_audio = AudioFileClip(song)
56
+ song_audio = song_audio.subclip(0, final_clip.duration)
57
+ song_audio = audio_fadeout(song_audio, 3) # A帽adir fade out de 3 segundos al final de la canci贸n
58
  final_clip = final_clip.set_audio(song_audio)
59
 
60
+ # Guardar el video resultante
61
+ output_path = "output_video.mp4"
62
+ final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
63
 
64
+ return output_path, None # Devolver el archivo generado para la descarga y None para el error
65
  except Exception as e:
66
+ return None, f"Error al concatenar los clips: {str(e)}"
67
 
68
  # Crear la interfaz de Gradio
69
+ video_inputs = [gr.Video(label=f"Sube el video {i+1}") for i in range(5)] # Eliminar el argumento `type`
70
+ rotation_inputs = [gr.Radio(["Sin rotaci贸n", "90 grados", "180 grados", "270 grados"], label=f"Rotar video {i+1}") for i in range(5)]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
+ demo = gr.Interface(
73
+ fn=process_videos,
74
+ inputs=video_inputs + rotation_inputs + [gr.Audio(label="Sube una canci贸n")],
75
+ outputs=[
76
+ gr.Video(label="Previsualiza tu video procesado"), # Para mostrar el video en un reproductor
77
+ gr.File(label="Descargar video procesado") # Para permitir la descarga del video final
78
+ ],
79
+ title="Mezclar y Unir Videos con Rotaci贸n y M煤sica",
80
+ description="Sube varios videos, corta los primeros 2 segundos, ajusta la rotaci贸n de cada uno, y a帽ade m煤sica.",
81
+ )
82
 
83
  # Ejecutar la interfaz
84
+ demo.launch(share=True)