| import gradio as gr | |
| import subprocess | |
| import uuid | |
| import os | |
| def process_video(video_path): | |
| if video_path is None: | |
| return None, "❌ الرجاء رفع فيديو" | |
| output_file = f"output_{uuid.uuid4().hex}.mp4" | |
| command = [ | |
| "ffmpeg", | |
| "-i", video_path, | |
| "-filter:v", "fps=30", | |
| "-c:a", "copy", | |
| "-vsync", "cfr", | |
| output_file, | |
| "-y" | |
| ] | |
| try: | |
| subprocess.run(command, check=True) | |
| return output_file, "✅ تم تجهيز الفيديو بنجاح (30FPS ثابت)" | |
| except subprocess.CalledProcessError: | |
| return None, "❌ حدث خطأ أثناء المعالجة" | |
| with gr.Blocks(title="FFmpeg 30FPS Converter") as demo: | |
| gr.Markdown("## 🎬 تحويل الفيديو إلى 30FPS ثابت") | |
| gr.Markdown("ارفع الفيديو وسيتم تجهيزه تلقائيًا") | |
| video_input = gr.Video(label="📤 رفع الفيديو") | |
| btn = gr.Button("⚙️ تجهيز الفيديو") | |
| output_file = gr.File(label="📥 تحميل الفيديو") | |
| status = gr.Textbox(label="الحالة", interactive=False) | |
| btn.click(process_video, inputs=video_input, outputs=[output_file, status]) | |
| demo.launch() | |