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)
|