Spaces:
Build error
Build error
| 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() | |