vi2 / app.py
GAS17's picture
Update app.py
f005c80 verified
raw
history blame
3.63 kB
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)