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()