Spaces:
Running
on
T4
Running
on
T4
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" | |
# Altura e largura desejadas para o vídeo de saída | |
desired_height = 1280 | |
desired_width = 720 | |
# Comando ffmpeg revisado para usar a codificação NVENC | |
ffmpeg_cmd = ( | |
f'ffmpeg -hwaccel cuda -i "{video1_path}" -i "{video2_path}" ' | |
f'-filter_complex ' | |
f'"[0:v]scale_cuda=-2:{desired_height}:force_original_aspect_ratio=decrease,scale_cuda={desired_width}:{desired_height}:force_original_aspect_ratio=increase,crop={desired_width}:{desired_height}[v0];' | |
f'[1:v]scale_cuda=-2:{desired_height}:force_original_aspect_ratio=decrease,scale_cuda={desired_width}:{desired_height}:force_original_aspect_ratio=increase,crop={desired_width}:{desired_height}[v1];' | |
f'[v0][v1]vstack=inputs=2[v]" ' | |
f'-map "[v]" -c:v h264_nvenc -preset fast {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() | |