import gradio as gr import subprocess import os from uuid import uuid4 def get_video_duration(video_path): """Obtém a duração do vídeo usando ffprobe.""" cmd = f"ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 \"{video_path}\"" result = subprocess.run(cmd, shell=True, text=True, capture_output=True) duration = float(result.stdout) return duration def merge_videos(video1_path, video2_path): output_filename = f"{uuid4()}_merged.mp4" # Não limitaremos a duração ao vídeo 1, pois queremos o vídeo completo mesclado. # A largura comum permanece, mas agora lidaremos com aspect ratios variados de forma mais dinâmica. common_width = 720 ffmpeg_cmd = ( f'ffmpeg -i "{video1_path}" -i "{video2_path}" ' f'-filter_complex ' f'"[0:v]scale={common_width}:-2:force_original_aspect_ratio=decrease,pad={common_width}:(ih*2):(ow-iw)/2:0,setdar=dar[v0];' f'[1:v]scale={common_width}:-2:force_original_aspect_ratio=decrease,pad={common_width}:(ih*2):(ow-iw)/2:ih,setdar=dar[v1];' f'[v0][v1]concat=n=2:v=1:a=0[v]" ' f'-map "[v]" -map 0:a? -c:v libx264 -c:a aac {output_filename}' ) subprocess.run(ffmpeg_cmd, shell=True, check=True) return output_filename def gradio_interface(video1, video2): # Os vídeos já são passados como caminhos de arquivo temporário, então não precisamos abrir e salvar output_video = merge_videos(video1, video2) return output_video iface = gr.Interface(fn=gradio_interface, inputs=[gr.Video(label="Video 1"), gr.Video(label="Video 2")], outputs=gr.Video(label="Vídeo Mesclado"), title="Mesclador de Vídeos para TikTok", description="Faça upload de dois vídeos para mesclá-los verticalmente em um estilo adequado para TikTok.") if __name__ == "__main__": iface.launch()