File size: 4,295 Bytes
a5d0e38
 
 
7545ca5
a5d0e38
7545ca5
 
 
a5d0e38
7545ca5
a5d0e38
7545ca5
 
 
 
 
 
 
 
 
 
 
 
a5d0e38
 
 
 
7545ca5
 
 
 
 
 
 
 
 
 
 
 
a5d0e38
7545ca5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a5d0e38
7545ca5
 
 
 
 
 
a5d0e38
7545ca5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a5d0e38
 
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import gradio as gr
import subprocess
import os
from pathlib import Path

# Install ffmpeg (runs once when space starts)
subprocess.run(["apt-get", "update"], check=False)
subprocess.run(["apt-get", "install", "-y", "ffmpeg"], check=False)

def convert_audio(audio_file, output_format):
    try:
        if audio_file is None:
            return "βœ— No file uploaded", None
        
        # Create output filename
        input_path = audio_file
        output_path = f"/tmp/output.{output_format}"
        
        # Run FFmpeg command
        cmd = ["ffmpeg", "-i", input_path, "-y", output_path]
        subprocess.run(cmd, capture_output=True, check=True)
        
        return f"βœ“ Converted to {output_format.upper()}", output_path
    
    except Exception as e:
        return f"βœ— Error: {str(e)}", None

def extract_audio(video_file):
    try:
        if video_file is None:
            return "βœ— No file uploaded", None
        
        output_path = "/tmp/extracted_audio.mp3"
        
        # Extract audio from video
        cmd = ["ffmpeg", "-i", video_file, "-q:a", "0", "-map", "a", "-y", output_path]
        subprocess.run(cmd, capture_output=True, check=True)
        
        return "βœ“ Audio extracted", output_path
    
    except Exception as e:
        return f"βœ— Error: {str(e)}", None

def compress_video(video_file, quality):
    try:
        if video_file is None:
            return "βœ— No file uploaded", None
        
        output_path = "/tmp/compressed_video.mp4"
        crf_value = int(quality)  # 0-51, lower = better quality
        
        # Compress video
        cmd = ["ffmpeg", "-i", video_file, "-crf", str(crf_value), "-y", output_path]
        subprocess.run(cmd, capture_output=True, check=True)
        
        return "βœ“ Video compressed", output_path
    
    except Exception as e:
        return f"βœ— Error: {str(e)}", None

# Create Gradio interface
with gr.Blocks(title="FFmpeg Tools") as demo:
    gr.Markdown("# FFmpeg Media Tools")
    
    with gr.Tabs():
        # Tab 1: Audio Conversion
        with gr.Tab("Audio Converter"):
            gr.Markdown("Convert audio between formats")
            audio_input = gr.Audio(label="Upload Audio", type="filepath")
            format_select = gr.Dropdown(
                choices=["mp3", "wav", "aac", "flac", "ogg"],
                value="mp3",
                label="Output Format"
            )
            audio_convert_btn = gr.Button("Convert", variant="primary")
            audio_status = gr.Textbox(label="Status", interactive=False)
            audio_output = gr.File(label="Download")
            
            audio_convert_btn.click(
                fn=convert_audio,
                inputs=[audio_input, format_select],
                outputs=[audio_status, audio_output]
            )
        
        # Tab 2: Extract Audio from Video
        with gr.Tab("Extract Audio"):
            gr.Markdown("Extract audio track from video files")
            video_input = gr.Video(label="Upload Video")
            extract_btn = gr.Button("Extract Audio", variant="primary")
            extract_status = gr.Textbox(label="Status", interactive=False)
            extract_output = gr.File(label="Download MP3")
            
            extract_btn.click(
                fn=extract_audio,
                inputs=[video_input],
                outputs=[extract_status, extract_output]
            )
        
        # Tab 3: Video Compression
        with gr.Tab("Video Compressor"):
            gr.Markdown("Compress video files (lower CRF = better quality)")
            video_comp_input = gr.Video(label="Upload Video")
            quality_slider = gr.Slider(
                minimum=18,
                maximum=51,
                value=28,
                step=1,
                label="Quality (CRF: 18=high, 51=low)"
            )
            compress_btn = gr.Button("Compress", variant="primary")
            compress_status = gr.Textbox(label="Status", interactive=False)
            compress_output = gr.File(label="Download")
            
            compress_btn.click(
                fn=compress_video,
                inputs=[video_comp_input, quality_slider],
                outputs=[compress_status, compress_output]
            )

demo.launch()