File size: 3,545 Bytes
c7810b4
f92b394
 
 
dabc55d
f92b394
066c136
b88d490
 
 
066c136
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
066c136
 
 
b88d490
dabc55d
b88d490
 
dabc55d
066c136
51ed60c
 
e4b8ade
 
 
066c136
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
import os
import random
import ffmpeg
import gradio as gr
import traceback

# Debug log list (for internal logging)
debug_logs = []

def log_message(message):
    """Log messages for internal 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  # Just return None, no debug logs displayed

        return output_video  # Only return the output video

    except Exception as e:
        error_message = f"Error in process_video: {str(e)}"
        log_message(error_message)
        traceback.print_exc()
        return None  # If an error occurs, return None without the debug logs

# Gradio Interface
interface = gr.Interface(
    fn=process_video,
    inputs=gr.Video(label="Upload Video"),
    outputs=gr.Video(label="Video with Background Music"),  # Only output the video
    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)