FFmpeg समझें: वो मेंटल मॉडल जो आप मिस कर रहे हैं
FFmpeg कमांड बिना समझे कॉपी करना बंद करें। containers, codecs, streams और filters का मेंटल मॉडल सीखें और असली काम आने वाली recipes पाएं।

हम सबके साथ ऐसा हो चुका है। आपको एक वीडियो कन्वर्ट करना है, तो 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 उतना जटिल है भी नहीं। इसका एक सुसंगत मेंटल मॉडल है, और एक बार वो समझ आ जाए तो लगभग हर कमांड पढ़ने लायक लगने लगता है। दिक्कत यह है कि कोई मॉडल समझाता ही नहीं — बस कमांड थमा देते हैं। तो चलिए, इसे ठीक करते हैं।
Containers बनाम Codecs: सबसे पहले यही समझें
वीडियो फ़ाइलों में होने वाली सबसे बड़ी उलझन containers और codecs के फ़र्क से आती है। Container फ़ाइल फ़ॉर्मेट है — .mp4, .mkv, .webm, .mov। यह एक डिब्बा है जिसमें चीज़ें रखी जाती हैं। Codec वह तरीका है जिससे उस डिब्बे के अंदर की असली वीडियो और ऑडियो डेटा को compress किया जाता है — H.264, H.265, VP9, AV1, AAC, Opus।
एक MP4 फ़ाइल में H.264 वीडियो के साथ AAC ऑडियो हो सकता है, या H.265 वीडियो के साथ Opus ऑडियो, या ऐसे दर्जनों और combinations। MKV फ़ाइल में लगभग कुछ भी हो सकता है। जब कोई कहता है “MP4 में कन्वर्ट करो,” तो आमतौर पर उसका मतलब होता है “H.264 वीडियो और AAC ऑडियो को MP4 container में डालो” — लेकिन ये तीन अलग-अलग फ़ैसले हैं।
# 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 होती है — वही streams बिना re-encode किए दूसरे container में डालना। यह लगभग तुरंत हो जाता है।
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 में पोज़िशन मायने रखती है। यही बात सबको उलझाती है। किसी option का मतलब इस पर निर्भर कर सकता है कि वह -i से पहले आता है या बाद में। ऊपर दिया -ss उदाहरण सबसे आम केस है: इसे -i से पहले रखने पर FFmpeg सीधे input फ़ाइल में seek करता है (तेज़, पर शायद थोड़ा अपरिशुद्ध), जबकि बाद में रखने पर FFmpeg उस बिंदु तक सब कुछ decode करता है और फिर output देना शुरू करता है (धीमा, पर frame-accurate)।
Stream Selection: FFmpeg को बताएँ आपको क्या चाहिए
वीडियो फ़ाइलों में अक्सर कई streams होते हैं — वीडियो, ऑडियो, subtitles, और कभी-कभी अलग-अलग भाषाओं में कई ऑडियो ट्रैक। FFmpeg एक stream specifier syntax देता है ताकि आप खास streams को चुन सकें:
-c:v— वीडियो streams का codec (v = video)-c:a— ऑडियो streams का codec (a = audio)-c:s— subtitle streams का codec (s = subtitle)-c copy— सभी streams को बिना re-encode किए copy करें-c:v copy -c:a aac— वीडियो को जैसा है वैसा copy करें, ऑडियो को AAC में re-encode करें-map 0:a:1— पहले input से दूसरा ऑडियो stream चुनें
-c copy फ़्लैग सबसे ज़रूरी है जो आपको जानना चाहिए। यह FFmpeg को बताता है कि stream data को बिना re-encode किए सीधे copy करे। यह लगभग तुरंत होता है और lossless है — आप बस डेटा को एक container से दूसरे में ले जा रहे हैं। जब भी codec बदलने की ज़रूरत न हो, -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
काम आने वाली Practical Recipes
ये वे कमांड हैं जो मैं लगातार इस्तेमाल करता हूँ। हर एक को समझाया गया है ताकि आप अपनी ज़रूरत के हिसाब से बदल सकें।
वेब के लिए वीडियो Compress करें
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) वैल्यू सबसे अहम quality knob है। कम संख्या का मतलब है बेहतर quality और बड़ी फ़ाइल। ज़्यादातर web video के लिए CRF 20-25 सबसे अच्छा बिंदु है। मैं आम तौर पर जिस वीडियो का अच्छा दिखना ज़रूरी हो उसके लिए 22 रखता हूँ, और बैकग्राउंड या सहायक वीडियो के लिए 26, जहाँ quality उतनी मायने नहीं रखती।
बिना re-encode किए वीडियो Trim करें
# 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
Thumbnails बनाएँ
# 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)
Filters समझें: असली ताकत
Filters ही वह जगह है जहाँ FFmpeg “काम का टूल” से “हैरान कर देने वाला शक्तिशाली” बन जाता है। -vf फ़्लैग (video filter) और -af फ़्लैग (audio filter) आपको processing operations को chain करने देते हैं। Sequential processing के लिए filters को कॉमा से अलग किया जाता है, और complex filter graphs के लिए semicolon से।
# 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
Filter system इतना गहरा है कि उस पर अलग article बन सकता है, पर मुख्य बात यह है: filters decoded frames पर काम करते हैं। यानी filters के साथ -c copy इस्तेमाल नहीं कर सकते — वीडियो को decode, filter, और फिर re-encode करना ही पड़ता है। अगर आपके कमांड में -vf है, तो पूरे re-encode के लिए समय रखें।
Hardware Acceleration: अपने GPU का इस्तेमाल करें
अगर आप नियमित रूप से वीडियो encode करते हैं, तो hardware acceleration 5-10 गुना तक रफ़्तार बढ़ा सकता है। आधुनिक GPUs में समर्पित encoding hardware होता है, जिसे 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)'
एक चेतावनी: hardware encoders तेज़ होते हैं, पर software encoding (libx264) की तुलना में एक जैसी visual quality पर आम तौर पर थोड़ी बड़ी फ़ाइलें बनाते हैं। जहाँ quality मायने रखती है ऐसे one-off transcodes के लिए software encoding अब भी बेहतर है। Batch processing या real-time streaming के लिए hardware acceleration साफ़ विजेता है। मैं final production encodes के लिए libx264 और बाकी सब के लिए NVENC इस्तेमाल करता हूँ।
आम गलतियाँ और उनसे कैसे बचें
- ज़रूरत न होने पर भी re-encode करना। अगर आप सिर्फ़ trim कर रहे हैं, audio निकाल रहे हैं, या container बदल रहे हैं, तो
-c copyइस्तेमाल करें। जिस वीडियो से बस 30 सेकंड काटने हैं, उसे re-encode करने में 20 मिनट लगाने की कोई वजह नहीं। - बहुत कम CRF वैल्यू रखना। CRF 18 से भारी फ़ाइलें बनती हैं, जिनमें quality सुधार ज़्यादातर लोग देख भी नहीं पाते। 23 से शुरू करें, और सिर्फ़ artifacts दिखें तभी कम करें। ज़्यादातर web content के लिए 23-25 काफ़ी है।
-movflags +faststartभूल जाना। इसके बिना MP4 की metadata फ़ाइल के आख़िर में होती है, यानी browsers पूरी फ़ाइल डाउनलोड होने तक चलाना शुरू नहीं कर पाते। Web video के लिए इसे हमेशा जोड़ें।- इनपुट पहले न जाँचना। कमांड लिखने से पहले
ffprobeचलाएँ। input codecs, resolution और stream layout पता हो तो सब आसान हो जाता है। - कहीं न जाने वाला pipe। अगर FFmpeg अटका हुआ लगे, तो शायद वह आपसे कोई सवाल पूछ रहा है (जैसे मौजूदा फ़ाइल overwrite करनी है या नहीं)। ऑटो-overwrite के लिए
-yजोड़ें, या कभी overwrite न करने के लिए-n।
चीट शीट
यह वह है जो मैं अपने desktop पर एक text फ़ाइल में रखता हूँ। रोज़मर्रा की ज़रूरत का लगभग 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 ऐसा टूल नहीं जिसे एक दिन में महारत मिल जाए। पर एक बार मेंटल मॉडल समझ आ जाए — containers streams रखते हैं, streams के codecs होते हैं, options अगली फ़ाइल पर लागू होते हैं, filters के लिए re-encode ज़रूरी है — तो documentation भी समझ आने लगती है। आप कमांड अंधाधुंध कॉपी करना बंद करके उन्हें सोच-समझकर लिखने लगते हैं। और ईमानदारी से कहूँ तो “यह जादू है” से “ओह, यह तो यह कर रहा है” तक का यह बदलाव developer के तौर पर सबसे संतोषजनक पलों में से एक है।


