Spaces:
Sleeping
Sleeping
import os | |
import random | |
import ffmpeg | |
import gradio as gr | |
import traceback | |
# Debug log list | |
debug_logs = [] | |
def log_message(message): | |
"""Log messages for debugging.""" | |
debug_logs.append(message) | |
print(message) | |
# Function to add music to video | |
def add_music_to_video(video_path, chunks_folder="./chunks", output_path="output_with_music.mp4"): | |
try: | |
log_message("Starting add_music_to_video process...") | |
# List all MP3 files in the chunks folder | |
music_files = [os.path.join(chunks_folder, f) for f in os.listdir(chunks_folder) if f.endswith('.mp3')] | |
if not music_files: | |
error_message = "Error: No audio files found in the chunks folder." | |
log_message(error_message) | |
return error_message | |
# Randomly select one MP3 file | |
music_file_path = random.choice(music_files) | |
log_message(f"Selected music file: {music_file_path}") | |
# Get the duration of the video | |
video_info = ffmpeg.probe(video_path) | |
video_duration = float(video_info['streams'][0]['duration']) | |
log_message(f"Video duration: {video_duration} seconds") | |
# Trim the music file to match the video duration | |
trimmed_music_path = "trimmed_music.mp3" | |
ffmpeg.input(music_file_path).output( | |
trimmed_music_path, ss=0, t=video_duration | |
).run(overwrite_output=True) | |
log_message("Music trimmed successfully.") | |
# Combine video and audio | |
video_input = ffmpeg.input(video_path) | |
audio_input = ffmpeg.input(trimmed_music_path) | |
ffmpeg.concat(video_input, audio_input, v=1, a=1).output( | |
output_path, vcodec="libx264", acodec="aac", strict="experimental" | |
).run(overwrite_output=True) | |
log_message(f"Video with music saved to: {output_path}") | |
return output_path | |
except Exception as e: | |
error_message = f"Error in add_music_to_video: {str(e)}" | |
log_message(error_message) | |
traceback.print_exc() | |
return error_message | |
# Define Gradio interface | |
def process_video(uploaded_video): | |
try: | |
log_message("Video received for processing.") | |
# Ensure the correct handling of uploaded_video as a string or file object | |
if isinstance(uploaded_video, str): | |
video_path = uploaded_video # If it's already a string path | |
else: | |
video_path = uploaded_video.name # File-like object with a .name attribute | |
log_message(f"Uploaded video path: {video_path}") | |
output_video = add_music_to_video(video_path, chunks_folder="./chunks") | |
if "Error" in output_video: | |
return None | |
return output_video | |
except Exception as e: | |
error_message = f"Error in process_video: {str(e)}" | |
log_message(error_message) | |
traceback.print_exc() | |
return None | |
# Gradio Interface with more nature and music-themed emojis | |
interface = gr.Interface( | |
fn=process_video, | |
inputs=gr.Video(label="πΏ Upload Your Video π±"), | |
outputs=[ | |
gr.Video(label="πΆ Your Video with Nature's Vibes π³π§"), | |
], | |
title="Create Nature Vibes πΏππΆ", | |
description="π³π» Upload a video, and this app will add a 10-second nature-inspired background music track πΆ that matches the video duration πΏπ. Let the natural vibes flow! π§" | |
) | |
# Launch Gradio app | |
interface.launch(share=True) | |