Spaces:
Sleeping
Sleeping
File size: 3,477 Bytes
c7810b4 f92b394 dabc55d f92b394 e4b8ade b88d490 e4b8ade b88d490 e4b8ade b88d490 f92b394 ba76d39 dabc55d e4b8ade b88d490 dabc55d e4b8ade dabc55d b88d490 e4b8ade dabc55d b88d490 e4b8ade dabc55d b88d490 e4b8ade dabc55d e4b8ade dabc55d e4b8ade dabc55d e4b8ade b88d490 dabc55d b88d490 f92b394 dabc55d b88d490 e4b8ade b88d490 ba76d39 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 51ed60c e4b8ade 7048a54 e4b8ade 51ed60c f92b394 e4b8ade |
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 92 93 94 95 96 97 |
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, "\n".join(debug_logs)
return output_video, "\n".join(debug_logs)
except Exception as e:
error_message = f"Error in process_video: {str(e)}"
log_message(error_message)
traceback.print_exc()
return None, "\n".join(debug_logs)
# Gradio Interface
interface = gr.Interface(
fn=process_video,
inputs=gr.Video(label="Upload Video"),
outputs=[
gr.Video(label="Video with Background Music"),
gr.Textbox(label="Debug Logs")
],
title="Create Nature Vibes", # Changed the title
description="Upload a video, and this app will add a background music track that matches the video duration, creating a soothing nature vibe."
)
# Launch Gradio app
interface.launch(share=True)
|