Spaces:
Sleeping
Sleeping
File size: 3,775 Bytes
c7810b4 f92b394 dabc55d f92b394 b88d490 f92b394 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 f92b394 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 dabc55d b88d490 51ed60c b88d490 51ed60c f92b394 dabc55d |
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 98 99 100 101 102 103 104 |
import os
import random
import ffmpeg
import gradio as gr
import traceback
# Global variable to store logs
debug_logs = []
# Function to log messages
def log_message(message):
global debug_logs
debug_logs.append(message)
print(message) # Print to console as well for backend debugging
# 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 the process to add music to video...")
# Check if chunks folder exists
if not os.path.exists(chunks_folder):
error_message = "Error: Chunks folder does not exist."
log_message(error_message)
return error_message
# 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(f"Trimmed music saved at: {trimmed_music_path}")
# 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"Output video saved at: {output_path}")
return output_path
except Exception as e:
error_message = f"Error during processing: {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.")
video_path = uploaded_video.name
log_message(f"Uploaded video path: {video_path}")
output_video = add_music_to_video(video_path, chunks_folder="/content/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
with gr.Blocks() as interface:
gr.Markdown("# Add Background Music to Video")
gr.Markdown("Upload a video, and this app will add a background music track that matches the video duration.")
with gr.Row():
with gr.Column():
video_input = gr.Video(label="Upload Video")
submit_button = gr.Button("Generate Video")
with gr.Column():
video_output = gr.Video(label="Video with Background Music")
debug_output = gr.Textbox(label="Debug Logs", lines=10, interactive=False)
submit_button.click(
fn=process_video,
inputs=[video_input],
outputs=[video_output, debug_output]
)
# Launch Gradio app
interface.launch(share=True, debug=True)
|