سلام رفقای ویدپروتکت! اگه توسعهدهنده هستید و با صوت و تصویر سر و کار دارید، حتماً اسم FFmpeg به گوشتون خورده. FFmpeg یه ابزار خط فرمان (Command Line) خفن و همهکارهست که مثل آچار فرانسه برای کار با فایلهای مدیا عمل میکنه. از تبدیل فرمت و تغییر سایز ویدیو گرفته تا استخراج صدا، اضافه کردن واترمارک، و حتی استریم زنده، FFmpeg کارتون رو راه میندازه. تو این مقاله میخوایم یه شیرجه عمیق بزنیم تو دنیای FFmpeg و نکات ناب و کاربردی رو با هم یاد بگیریم که به درد برنامهنویسی و توسعه میخوره. پس اگه آمادهاید، بزن بریم!
FFmpeg اصلاً چی هست؟
به زبان ساده، FFmpeg مجموعهای از کتابخونهها و برنامههای متنبازه که برای پردازش، تبدیل، ضبط و پخش انواع فرمتهای صوتی و تصویری استفاده میشه. قدرت اصلی FFmpeg توی خط فرمانشه. با نوشتن دستورات مختلف، میتونید دقیقاً بهش بگید که با فایل مدیاتون چیکار کنه. شاید اولش کار با خط فرمان یه کم ترسناک به نظر بیاد، ولی وقتی قلقش دستتون بیاد، میبینید که چقدر قدرتمند و انعطافپذیره.
چرا به عنوان توسعهدهنده باید FFmpeg رو بلد باشیم؟
- اتوماسیون پردازش مدیا: خیلی وقتها لازمه که تعداد زیادی فایل مدیا رو به صورت خودکار پردازش کنیم. مثلاً تغییر سایز تمام ویدیوهای آپلود شده توسط کاربر یا تبدیل فرمت اونها. FFmpeg به راحتی با اسکریپتهای مختلف (مثل Bash، Python، Node.js و…) ترکیب میشه و این کارها رو براتون انجام میده.
- کنترل دقیق روی خروجی: با FFmpeg کنترل کاملی روی تمام جزئیات فایل خروجی دارید. از بیتریت و کدک گرفته تا فریمریت و رزولوشن، همهچیز تحت فرمان شماست.
- پشتیبانی از فرمتهای متنوع: FFmpeg تقریباً از تمام فرمتهای صوتی و تصویری رایج و حتی غیر رایج پشتیبانی میکنه. دیگه نگران این نیستید که کاربر چه فایلی آپلود میکنه.
- رایگان و متنباز: نیازی به پرداخت هزینههای سنگین برای لایسنس نرمافزارهای تجاری نیست. FFmpeg رایگان و متنبازه و جامعه کاربری فعالی هم داره.
- ابزاری برای خلاقیت: با ترکیب دستورات مختلف FFmpeg میتونید کارهای خلاقانهای انجام بدید. مثلاً ساخت GIF از قسمتی از ویدیو، اضافه کردن افکتهای ساده، یا حتی تولید ویدیو از مجموعهای از تصاویر.
نصب FFmpeg
نصب FFmpeg بسته به سیستمعاملتون متفاوته:
- لینوکس: معمولاً با دستور
sudo apt install ffmpeg
(برای توزیعهای دبیان/اوبونتو) یاsudo yum install ffmpeg
(برای توزیعهای فدورا/سنتاواس) نصب میشه.
- مک: با استفاده از Homebrew و دستور
brew install ffmpeg
به راحتی نصب میشه.
- ویندوز: میتونید فایلهای باینری از پیش کامپایل شده رو از وبسایت رسمی FFmpeg دانلود کنید و به Path سیستمتون اضافه کنید. (یه سرچ ساده “install ffmpeg windows” راهنماییهای خوبی بهتون میده).
بعد از نصب، با زدن دستور ffmpeg -version
توی ترمینال یا خط فرمان، باید اطلاعات مربوط به نسخه نصب شده رو ببینید.
ساختار اصلی دستورات FFmpeg
دستورات FFmpeg معمولاً یه ساختار کلی دارن:
Bash
ffmpeg [گزینههای عمومی] -i [فایل ورودی] [گزینههای مربوط به فایل خروجی] [فایل خروجی]
ffmpeg
: خود برنامه FFmpeg.[گزینههای عمومی]
: تنظیماتی که روی کل عملیات تاثیر میذارن (مثلاً-y
برای بازنویسی فایل خروجی بدون پرسیدن).-i [فایل ورودی]
:-i
مخفف input هست و بعدش مسیر فایل ورودی رو مشخص میکنید. میتونید چندین فایل ورودی هم داشته باشید.[گزینههای مربوط به فایل خروجی]
: اینجا تنظیمات مربوط به کدک، بیتریت، رزولوشن و… فایل خروجی رو مشخص میکنید.[فایل خروجی]
: اسم و مسیر فایل خروجی. پسوند فایل خروجی معمولاً فرمت رو مشخص میکنه (مثلاًoutput.mp4
).
نکات ناب و دستورات کاربردی برای توسعهدهندگان
خب، بریم سراغ قسمت هیجانانگیز ماجرا! اینجا چند تا دستور و نکته کاربردی رو با هم مرور میکنیم:
-
تبدیل فرمت ساده:
Bash
ffmpeg -i input.mov output.mp4
این دستور ساده، فایل
input.mov
رو به فرمتmp4
تبدیل میکنه. FFmpeg معمولاً خودش کدکهای مناسب رو بر اساس پسوند فایل خروجی انتخاب میکنه. -
تغییر رزولوشن ویدیو:
Bash
ffmpeg -i input.mp4 -vf scale=1280:720 output_720p.mp4
با آپشن
-vf
(video filter) و فیلترscale
میتونید رزولوشن ویدیو رو تغییر بدید. اینجا ویدیو به رزولوشن 720p (1280×720) تغییر پیدا میکنه. اگه میخواید نسبت تصویر حفظ بشه و فقط عرض رو مشخص کنید، میتونید ازscale=640:-1
(یا ارتفاع رو مشخص کنید:scale=-1:480
) استفاده کنید. FFmpeg خودش ارتفاع (یا عرض) مناسب رو محاسبه میکنه. -
استخراج صدا از ویدیو:
Bash
ffmpeg -i input.mp4 -vn -acodec copy output.aac
-vn
: یعنی (no video) خروجی ویدیویی نداشته باشیم.-acodec copy
: یعنی کدک صوتی رو تغییر نده و همون کدک فایل ورودی رو برای خروجی استفاده کن (این کار سرعت رو خیلی بالا میبره و کیفیت صدا حفظ میشه). اگه بخواید به فرمت دیگهای مثل mp3 تبدیل کنید، میتونید از-acodec libmp3lame
استفاده کنید.
-
برش قسمتی از ویدیو:
Bash
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:15 -c copy output_trimmed.mp4
-ss [زمان شروع]
: زمان شروع برش رو مشخص میکنه (فرمت: HH:MM:SS.mmm).-to [زمان پایان]
: زمان پایان برش رو مشخص میکنه. (میتونید به جای-to
از-t [مدت زمان]
هم استفاده کنید. مثلاً-t 30
برای برش ۳۰ ثانیه از زمان شروع).-c copy
: یعنی کدکهای صوتی و تصویری رو بدون انکود مجدد کپی کن. این کار سرعت رو فوقالعاده بالا میبره و از افت کیفیت جلوگیری میکنه، به شرطی که فرمت ورودی و خروجی یکی باشه. نکته طلایی: اگه-ss
رو قبل از-i
قرار بدید، FFmpeg خیلی سریعتر به نقطه شروع میپره (seek میکنه)، مخصوصاً برای فایلهای بزرگ. اما ممکنه دقتش یه کم کمتر بشه. برای دقت بیشتر،-ss
رو بعد از-i
بذارید.
-
گرفتن یک فریم از ویدیو به عنوان تصویر:
Bash
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output_frame.jpg
-ss 00:00:05
: به ثانیه پنجم ویدیو برو.-vframes 1
: فقط یک فریم رو استخراج کن.
-
ایجاد GIF از قسمتی از ویدیو:
این یکی یه کم پیچیدهتره چون برای کیفیت خوب GIF باید چند مرحله رو طی کنیم. یه راه سادهتر ولی با کیفیت پایینتر اینه:
Bash
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif
-t 5
: به مدت ۵ ثانیه از ویدیو رو بگیر.-vf "fps=10,scale=320:-1:flags=lanczos"
: این یه فیلترگراف (filtergraph) هست.fps=10
: فریمریت GIF رو به ۱۰ فریم در ثانیه کاهش میده (برای حجم کمتر).scale=320:-1
: عرض GIF رو به ۳۲۰ پیکسل تغییر میده و ارتفاع رو متناسب با اون تنظیم میکنه.flags=lanczos
: از الگوریتم Lanczos برای تغییر سایز استفاده میکنه که کیفیت بهتری میده.
نکته حرفهای برای GIF با کیفیت: برای GIF با کیفیت بالاتر، اول یه پالت رنگی از ویدیو استخراج کنید و بعد با اون پالت GIF رو بسازید:
Bash
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -i palette.png -filter_complex "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output_high_quality.gif
این دو دستور اول یه فایل
palette.png
میسازن و بعد از اون برای ساخت GIF با کیفیتتر استفاده میکنن. -
اضافه کردن واترمارک (تصویر روی ویدیو):
Bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output_watermarked.mp4
-i watermark.png
: فایل تصویر واترمارک رو به عنوان ورودی دوم اضافه میکنه.-filter_complex "overlay=10:10"
: فیلترoverlay
تصویر دوم رو روی تصویر اول قرار میده.10:10
مختصات X و Y گوشه بالا سمت چپ واترمارک هست. میتونید از عباراتی مثلmain_w-overlay_w-10
(برای گوشه بالا راست) یا(main_w-overlay_w)/2:(main_h-overlay_h)/2
(برای وسط صفحه) هم استفاده کنید.
-
تغییر سرعت پخش ویدیو:
Bash
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output_fast.mp4 ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output_slow.mp4
setpts=0.5*PTS
: سرعت ویدیو رو دو برابر میکنه.setpts=2.0*PTS
: سرعت ویدیو رو نصف میکنه.- برای تغییر سرعت صدا هم باید از فیلتر صوتی
atempo
استفاده کنید. مثلاً برای دو برابر کردن سرعت:-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output_fast_with_audio.mp4
. این دستور یه کم پیچیدهتره چون همزمان هم تصویر و هم صدا رو پردازش میکنه.
-
اطلاعات فایل مدیا (مثل ffprobe):
FFmpeg یه ابزار همراه به اسم
ffprobe
داره که برای نمایش اطلاعات دقیق فایل مدیا استفاده میشه.Bash
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
-v quiet
: خروجیهای اضافی رو نشون نمیده.-print_format json
: خروجی رو به فرمت JSON نمایش میده (خیلی به درد برنامهنویسها میخوره).-show_format
: اطلاعات کلی فرمت فایل رو نشون میده.-show_streams
: اطلاعات مربوط به هر استریم (صوتی، تصویری، زیرنویس و…) رو نشون میده.
خروجی JSON این دستور رو میتونید توی برنامهتون پارس کنید و از اطلاعاتش (مثل مدت زمان، رزولوشن، کدکها و…) استفاده کنید.
-
کنترل کیفیت و حجم خروجی (CRF – Constant Rate Factor):
وقتی با کدک x264 (که برای MP4 خیلی رایجه) کار میکنید، آپشن
-crf
یه راه عالی برای کنترل تعادل بین کیفیت و حجمه. مقدار CRF معمولاً بین 0 (بدون افت کیفیت، حجم خیلی زیاد) تا 51 (کیفیت پایین، حجم خیلی کم) هست.Bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output_good_quality.mp4
-c:v libx264
: کدک ویدیویی رو x264 انتخاب میکنه.-crf 23
: یه مقدار مناسب برای کیفیت خوب و حجم معقوله. مقادیر کمتر کیفیت بهتر و حجم بیشتر، و مقادیر بیشتر کیفیت پایینتر و حجم کمتر نتیجه میدن. معمولاً بین 18 تا 28 مقادیر خوبی هستن.-c:a aac
: کدک صوتی رو AAC انتخاب میکنه.-b:a 128k
: بیتریت صدا رو 128 کیلوبیت بر ثانیه تنظیم میکنه.
-
استفاده از Preset ها برای سرعت انکود:
کدک x264 یه سری Preset از پیش تعریف شده داره که تعادل بین سرعت انکود و کیفیت/حجم خروجی رو مشخص میکنه.
Bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset ultrafast output_fast_encode.mp4 ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output_default_encode.mp4 ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset veryslow output_slow_encode_better_compression.mp4
Preset ها از
ultrafast
,superfast
,veryfast
,faster
,fast
,medium
(پیشفرض),slow
,slower
,veryslow
تاplacebo
(خیلی خیلی کند، معمولاً استفاده نمیشه) متغیرن. هرچی Preset سریعتر باشه، حجم فایل نهایی ممکنه یه کم بیشتر بشه (با CRF یکسان). برای اکثر کارهاmedium
یاfast
مناسبن. اگه خیلی عجله داریدultrafast
، و اگه دنبال بهترین فشردهسازی ممکن هستید (و زمان براتون مهم نیست)veryslow
. -
تولید HLS (HTTP Live Streaming) برای استریم تطبیقی:
اگه میخواید ویدیو رو برای وب استریم کنید و کیفیتش با سرعت اینترنت کاربر تطبیق پیدا کنه، HLS گزینه خیلی خوبیه.
Bash
ffmpeg -i input.mp4 \ -vf "scale=w=640:h=360:force_original_aspect_ratio=decrease,pad=w=640:h=360:x=(ow-iw)/2:y=(oh-ih)/2" \ -c:a aac -ar 48000 -b:a 96k \ -c:v libx264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 \ -hls_time 4 -hls_playlist_type vod -hls_segment_filename "stream_360p/segment%03d.ts" \ stream_360p/playlist.m3u8 \ \ -vf "scale=w=1280:h=720:force_original_aspect_ratio=decrease,pad=w=1280:h=720:x=(ow-iw)/2:y=(oh-ih)/2" \ -c:a aac -ar 48000 -b:a 128k \ -c:v libx264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 \ -hls_time 4 -hls_playlist_type vod -hls_segment_filename "stream_720p/segment%03d.ts" \ stream_720p/playlist.m3u8
این دستور یه کم طولانیه چون داره همزمان دو تا کیفیت (360p و 720p) از ویدیو رو برای HLS آماده میکنه. FFmpeg ویدیو رو به قطعات کوچیک (segment) با فرمت
.ts
تقسیم میکنه و یه فایلplaylist.m3u8
میسازه که پلیر از طریق اون میفهمه کدوم قطعات رو با چه کیفیتی پخش کنه.force_original_aspect_ratio=decrease,pad=...
: برای حفظ نسبت تصویر و اضافه کردن padding در صورت نیاز.-g 48 -keyint_min 48
: تنظیمات مربوط به فاصله بین keyframe ها (مهم برای HLS).-hls_time 4
: طول هر قطعه (segment) رو ۴ ثانیه در نظر میگیره.-hls_playlist_type vod
: مشخص میکنه که این یه ویدیوی از قبل ضبط شده است (Video on Demand). برای استریم زنده ازevent
استفاده میشه.-hls_segment_filename
: الگوی اسم فایلهای قطعات.
نکته: برای ساخت یه فایل m3u8 اصلی که به پلیلیستهای با کیفیتهای مختلف اشاره کنه (master playlist)، باید اون رو دستی بسازید یا از اسکریپتهای کمکی استفاده کنید.
-
استفاده از Pipe برای ترکیب با دستورات دیگه یا برنامهها:
FFmpeg میتونه ورودی رو از pipe بخونه و خروجی رو به pipe بفرسته. این قابلیت برای ترکیب FFmpeg با سایر ابزارهای خط فرمان یا برای ارسال و دریافت داده از برنامهتون (مثلاً Node.js یا Python) فوقالعاده کاربردیه.
- خواندن از stdin:
cat input.rawvideo | ffmpeg -f rawvideo -pix_fmt yuv420p -s 640x480 -i - output.mp4
- نوشتن به stdout:
ffmpeg -i input.mp4 -f nut - | ffplay -
(اینجا خروجی بهffplay
پایپ میشه)
وقتی با برنامهتون کار میکنید، میتونید
stdout
یه پروسه FFmpeg رو بخونید یا بهstdin
اون بنویسید. - خواندن از stdin:
چند نکته تکمیلی مهم:
- مستندات رسمی FFmpeg: بهترین دوست شما مستندات رسمی FFmpeg هست. هر آپشن و فیلتری که فکرش رو بکنید اونجا توضیح داده شده. یه سرچ ساده “ffmpeg [نام فیلتر یا آپشن]” معمولاً شما رو به صفحه مربوطه میرسونه.
- لاگهای FFmpeg: خروجیهای FFmpeg توی کنسول خیلی پر از اطلاعاته. بهشون دقت کنید، مخصوصاً وقتی به خطا میخورید. آپشن
-loglevel
(مثلاً-loglevel error
یا-loglevel verbose
) میتونه میزان جزئیات لاگ رو کنترل کنه. - آزمایش و خطا: بهترین راه یادگیری FFmpeg، آزمایش و خطاست. با فایلهای کوچیک شروع کنید و دستورات مختلف رو امتحان کنید.
- جامعه کاربری: اگر به مشکلی برخوردید، Stack Overflow و فرومهای تخصصی مدیا پر از سوال و جوابهای مربوط به FFmpeg هستن.
FFmpeg در دنیای برنامهنویسی
همونطور که گفتیم، FFmpeg فقط یه ابزار خط فرمان نیست. خیلی از زبانهای برنامهنویسی کتابخونههایی دارن که به عنوان یه Wrapper دور FFmpeg عمل میکنن و کار باهاش رو سادهتر میکنن. مثلا:
- Node.js: کتابخونههایی مثل
fluent-ffmpeg
خیلی محبوبن. - Python: کتابخونه
ffmpeg-python
یه گزینه خوبه. - PHP:
PHP-FFMpeg
کارتون رو راه میندازه.
این کتابخونهها بهتون اجازه میدن که دستورات FFmpeg رو به صورت برنامهنویسی تولید کنید، خروجیها و خطاها رو مدیریت کنید و حتی پیشرفت عملیات رو نمایش بدید. با این حال، درک اصول کار با FFmpeg از طریق خط فرمان، بهتون کمک میکنه که از این کتابخونهها هم بهتر استفاده کنید و بدونید پشت پرده چه اتفاقی میفته.
حرف آخر
رفقای ویدپروتکت، FFmpeg یه دنیای بیپایانه از امکاناته. چیزهایی که اینجا گفتیم فقط نوک کوه یخ بود. هرچقدر بیشتر باهاش کار کنید، بیشتر به قدرتش پی میبرید. نترسید، دستورات مختلف رو امتحان کنید و از امکاناتش برای ساختن محصولات و سرویسهای بهتر استفاده کنید. مطمئن باشید FFmpeg میتونه یکی از بهترین رفقای شما تو دنیای توسعه باشه.