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)