FFmpeg المبسّط: النموذج الذهني الذي تفتقده
توقف عن نسخ أوامر FFmpeg بشكل أعمى. تعلّم النموذج الذهني وراء الحاويات والترميزات والمسارات والفلاتر مع وصفات عملية ستستخدمها فعلاً.

كلنا مررنا بهذا الموقف. تحتاج إلى تحويل فيديو، فتبحث في Google وتجد إجابة على Stack Overflow فيها أمر يبدو كأن أحدهم ضرب لوحة المفاتيح عشوائياً: ffmpeg -i input.mov -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k -movflags +faststart output.mp4. تشغّله فيعمل. ولا تملك أدنى فكرة عن السبب، وفي المرة القادمة التي تحتاج فيها شيئاً مختلفاً قليلاً ستعود إلى Stack Overflow. فعلت ذلك لسنوات قبل أن أجلس أخيراً وأفهم ما الذي يريده مني FFmpeg فعلاً.
الحقيقة أن FFmpeg ليس معقداً إلى هذا الحد. لديه نموذج ذهني متسق، وبمجرد أن تستوعبه تصبح معظم الأوامر مقروءة. المشكلة أن أحداً لا يشرح هذا النموذج، بل يكتفون بإلقاء الأوامر عليك. لذا دعنا نصلح ذلك.
الحاويات مقابل الترميزات: أول ما يجب فهمه
أكبر مصدر للارتباك في ملفات الفيديو هو الفرق بين الحاويات والترميزات. الحاوية هي صيغة الملف، مثل .mp4 و.mkv و.webm و.mov، وهي صندوق يحتوي على أشياء. أما الترميز فهو الطريقة التي تُضغط بها بيانات الفيديو والصوت الفعلية داخل ذلك الصندوق، مثل H.264 وH.265 وVP9 وAV1 وAAC وOpus.
ملف MP4 قد يحتوي على فيديو H.264 مع صوت AAC، أو فيديو H.265 مع صوت Opus، أو عشرات التركيبات الأخرى. وملف MKV يمكن أن يحتوي على أي شيء تقريباً. وعندما يقول أحدهم «حوّله إلى MP4»، فهو غالباً يقصد «ضع فيديو H.264 وصوت AAC داخل حاوية MP4»، لكنها ثلاثة قرارات منفصلة.
# See what's actually inside a file
$ ffprobe -hide_banner video.mkv
Input #0, matroska:
Stream #0:0: Video: hevc (Main), 1920x1080, 23.98 fps
Stream #0:1: Audio: opus, 48000 Hz, stereo
Stream #0:2: Subtitle: subrip
# This file is:
# Container: MKV (Matroska)
# Video codec: HEVC (H.265)
# Audio codec: Opus
# Plus a subtitle stream
استخدم ffprobe قبل أي شيء آخر. يخبرك بالضبط بما تتعامل معه. في نصف الحالات، ما تظنه «تحويلاً» هو مجرد إعادة تغليف (remuxing)، أي نقل المسارات نفسها إلى حاوية مختلفة دون إعادة ترميز، وهذا يتم تقريباً فورياً.
بنية أمر FFmpeg
كل أمر في FFmpeg يتبع النمط نفسه، وبمجرد أن تلاحظه لن تستطيع تجاهله:
ffmpeg [global options] [input options] -i input [output options] output
# The KEY insight: options apply to the NEXT file.
# Options before -i apply to the input.
# Options after -i (before the output filename) apply to the output.
# This matters! These two commands are different:
ffmpeg -ss 00:01:00 -i video.mp4 output.mp4 # Seeks BEFORE decoding (fast)
ffmpeg -i video.mp4 -ss 00:01:00 output.mp4 # Seeks AFTER decoding (slow, precise)
الترتيب مهم في FFmpeg، وهذا ما يوقع الجميع في الفخ. قد يتغير معنى الخيار بحسب ما إذا كان يظهر قبل -i أم بعده. مثال -ss المذكور أعلاه هو الحالة الأشيع: وضعه قبل -i يجعل FFmpeg ينتقل مباشرةً إلى الموضع داخل ملف الدخل (سريع لكنه قد يكون غير دقيق)، بينما وضعه بعد -i يجعل FFmpeg يفك ترميز كل شيء حتى تلك النقطة ثم يبدأ الإخراج (بطيء لكنه دقيق على مستوى الإطار).
اختيار المسارات: كيف تخبر FFmpeg بما تريد
ملفات الفيديو غالباً تحتوي على عدة مسارات: فيديو وصوت وترجمات، وأحياناً عدة مسارات صوتية بلغات مختلفة. يستخدم FFmpeg صيغة محددات المسارات (stream specifier) لاستهداف مسارات بعينها:
-c:v— ترميز مسارات الفيديو (v = video)-c:a— ترميز مسارات الصوت (a = audio)-c:s— ترميز مسارات الترجمة (s = subtitle)-c copy— نسخ كل المسارات دون إعادة ترميز-c:v copy -c:a aac— نسخ الفيديو كما هو، وإعادة ترميز الصوت إلى AAC-map 0:a:1— اختيار مسار الصوت الثاني من ملف الدخل الأول
علامة -c copy هي الأهم في معرفتها. تخبر FFmpeg بنسخ بيانات المسار مباشرةً دون إعادة ترميز. هذا يتم فورياً وبلا فقدان للجودة، فأنت فقط تنقل البيانات من حاوية إلى أخرى. كلما لم تحتج إلى تغيير الترميز، استخدم -c copy.
# Remux MKV to MP4 without re-encoding (instant)
ffmpeg -i input.mkv -c copy output.mp4
# Copy video but re-encode audio (fast — only audio is processed)
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 192k output.mp4
# Extract just the audio stream
ffmpeg -i video.mp4 -vn -c:a copy audio.aac
# -vn means "no video" — drop the video stream entirely
وصفات عملية ستستخدمها فعلاً
هذه هي الأوامر التي أستخدمها باستمرار، وكل واحد منها مشروح حتى تتمكن من تعديله بما يناسب احتياجك.
ضغط فيديو للويب
ffmpeg -i raw_video.mov \
-c:v libx264 \
-preset slow \
-crf 23 \
-c:a aac -b:a 128k \
-movflags +faststart \
web_video.mp4
# -c:v libx264 → encode video with H.264
# -preset slow → slower encoding = smaller file (options: ultrafast to veryslow)
# -crf 23 → quality level (18=near lossless, 23=default, 28=low quality)
# -c:a aac → encode audio as AAC
# -b:a 128k → audio bitrate 128 kbps
# -movflags +faststart → move metadata to start of file for streaming
قيمة CRF (Constant Rate Factor) هي أهم مقبض للجودة. كلما كان الرقم أقل كانت الجودة أعلى والملف أكبر. بالنسبة لمعظم فيديوهات الويب، يكون النطاق 20 إلى 25 هو النقطة المثالية. أنا عادةً أستخدم 22 لأي شيء يجب أن يبدو جيداً، و26 للفيديوهات الخلفية أو المساندة التي لا تهم جودتها كثيراً.
قص فيديو دون إعادة ترميز
# Extract from 1:30 to 3:45 — no re-encoding, nearly instant
ffmpeg -ss 00:01:30 -to 00:03:45 -i input.mp4 -c copy trimmed.mp4
# If you need frame-accurate cuts (slower):
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:45 \
-c:v libx264 -crf 18 -c:a copy trimmed.mp4
توليد صور مصغرة
# Single thumbnail at the 10-second mark
ffmpeg -ss 00:00:10 -i video.mp4 -frames:v 1 thumb.jpg
# One thumbnail every 30 seconds
ffmpeg -i video.mp4 -vf "fps=1/30" thumbs/thumb_%04d.jpg
# Resize to 320px wide, maintain aspect ratio
ffmpeg -ss 00:00:10 -i video.mp4 -frames:v 1 \
-vf "scale=320:-1" thumb_small.jpg
إنشاء GIF من مقطع فيديو
# Good quality GIF with palette generation (two-pass)
ffmpeg -ss 00:00:05 -t 3 -i video.mp4 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1]; \
[s0]palettegen[p];[s1][p]paletteuse" \
output.gif
# -t 3 → duration: 3 seconds
# fps=15 → 15 frames per second (keep GIFs small)
# scale=480:-1 → resize to 480px wide
# palettegen/use → generate optimal color palette (much better quality)
فهم الفلاتر: الميزة الأقوى
هنا ينتقل FFmpeg من كونه «أداة مفيدة» إلى «قوة لا تصدق». علامة -vf (فلتر الفيديو) وعلامة -af (فلتر الصوت) تتيحان لك ربط عمليات معالجة متتالية. تُفصل الفلاتر بفواصل للمعالجة المتسلسلة، وبفاصلة منقوطة لرسوم الفلاتر المعقدة.
# Chain multiple filters: resize, then add padding for exact dimensions
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,\
pad=1280:720:(ow-iw)/2:(oh-ih)/2:black" output.mp4
# Normalize audio volume
ffmpeg -i input.mp4 -af "loudnorm" -c:v copy output.mp4
# Speed up a video 2x (with audio pitch correction)
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" fast.mp4
# Add text overlay
ffmpeg -i input.mp4 \
-vf "drawtext=text='DRAFT':fontsize=72:fontcolor=red:x=10:y=10" \
watermarked.mp4
نظام الفلاتر عميق بما يكفي لملء مقال كامل، لكن الفكرة الأساسية هي: الفلاتر تعالج الإطارات بعد فك ترميزها. وهذا يعني أنك لا تستطيع استخدام -c copy مع الفلاتر، إذ يجب فك ترميز الفيديو ثم فلترته ثم إعادة ترميزه. إذا كان أمرك يستخدم -vf، فخصص وقتاً لإعادة ترميز كاملة.
تسريع الأجهزة: استخدم كرت الشاشة
إذا كنت تقوم بترميز الفيديو بانتظام، فيمكن لتسريع الأجهزة أن يسرّع العمل بمقدار 5 إلى 10 مرات. كروت الشاشة الحديثة تحتوي على عتاد ترميز مخصص يستطيع FFmpeg استخدامه.
# NVIDIA GPU (NVENC)
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -crf 23 output.mp4
# Apple Silicon (VideoToolbox)
ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 5M output.mp4
# Intel Quick Sync (QSV)
ffmpeg -i input.mp4 -c:v h264_qsv -preset medium output.mp4
# Check what's available on your system:
ffmpeg -encoders 2>/dev/null | grep -E '(nvenc|videotoolbox|qsv|vaapi)'
تنبيه مهم: مرمّزات العتاد أسرع، لكنها عادةً تنتج ملفات أكبر قليلاً عند نفس الجودة البصرية مقارنةً بالترميز البرمجي (libx264). للتحويلات المنفردة التي تهم فيها الجودة، يبقى الترميز البرمجي أفضل. أما للمعالجة الدفعية أو البث المباشر، فتسريع العتاد هو الخيار الواضح. أنا أستخدم libx264 للترميزات النهائية للإنتاج، وNVENC لكل ما عدا ذلك.
أخطاء شائعة وكيفية تجنبها
- إعادة الترميز دون حاجة. إذا كنت تقص فقط، أو تستخرج الصوت، أو تغير الحاوية، فاستخدم
-c copy. لا يوجد سبب لتقضي 20 دقيقة في إعادة ترميز فيديو تقتطع منه 30 ثانية فقط. - استخدام قيمة CRF منخفضة جداً. قيمة 18 تنتج ملفات ضخمة بتحسينات في الجودة لا يلاحظها معظم الناس. ابدأ من 23، ولا تنزل أقل إلا إذا رأيت تشوهات. لمعظم محتوى الويب، يكفي 23 إلى 25.
- نسيان
-movflags +faststart. بدونه، تبقى بيانات MP4 الوصفية في نهاية الملف، ما يعني أن المتصفحات لا تستطيع بدء التشغيل حتى يكتمل تحميل الملف كله. أضفها دائماً لفيديو الويب. - عدم فحص الدخل أولاً. شغّل
ffprobeقبل كتابة أمرك. معرفة ترميزات الدخل والدقة وتخطيط المسارات تجعل كل شيء أسهل. - الانتظار بلا سبب. إذا بدا FFmpeg متوقفاً، فقد يكون ينتظر إجابة على سؤال، مثل هل تريد الكتابة فوق ملف موجود. أضف
-yللكتابة التلقائية فوق الملفات، أو-nلعدم الكتابة فوقها أبداً.
ورقة المرجع السريع
هذا ما أحتفظ به في ملف نصي على سطح المكتب. يغطي هذا نحو 90% مما أحتاجه يومياً:
# Probe a file
ffprobe -hide_banner input.mp4
# Remux (change container, no re-encode)
ffmpeg -i input.mkv -c copy output.mp4
# Compress for web
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k -movflags +faststart output.mp4
# Extract audio only
ffmpeg -i video.mp4 -vn -c:a copy audio.m4a
# Trim without re-encoding
ffmpeg -ss 00:01:00 -to 00:02:30 -i input.mp4 -c copy clip.mp4
# Resize to 720p
ffmpeg -i input.mp4 -vf "scale=-1:720" -c:a copy output.mp4
# Convert to GIF
ffmpeg -ss 5 -t 3 -i input.mp4 \
-vf "fps=12,scale=400:-1" output.gif
# Concatenate files (same codec)
echo "file 'part1.mp4'" > list.txt
echo "file 'part2.mp4'" >> list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy combined.mp4
FFmpeg ليس أداة تُتقن في يوم واحد. لكن بمجرد أن تفهم النموذج الذهني، أي أن الحاويات تحمل المسارات، وللمسارات ترميزات، والخيارات تُطبَّق على الملف التالي، والفلاتر تتطلب إعادة ترميز، تبدأ الوثائق في الإفادة. تتوقف عن نسخ الأوامر بعشوائية وتبدأ في تركيبها بقصد. وبصراحة، هذا التحول من «هذا سحر» إلى «آه، هكذا يعمل» من أكثر اللحظات إرضاءً التي يمكن أن يعيشها المطور.


