سلام به دوستان ویدپروتکت امن ترین هاست میزبانی ویدیو در جهان! تو مقاله قبلی در مورد آچار فرانسه دنیای ویدیو یعنی FFmpeg حرف زدیم الان میخایم در مورد استریم ویدیو با این غول با هم صحبت کنیم. شاید فکر کنی استریمینگ و پروتکلهاش یه چیز خیلی پیچیده و ترسناکه، ولی نترس! قراره ببینیم چطوری با همین FFmpeg دوستداشتنی میتونیم ویدیوها رو مثل هلو بفرستیم اینور اونور، یا حتی از هفت خوان پروتکلهای مختلف رد بشیم. پس اگه آمادهای، بزن بریم!
استریم ویدیو یعنی چی اصلاً؟ چرا مهمه؟
ببین، قدیما اگه میخواستی یه ویدیو ببینی، باید اول کامل دانلودش میکردی. یعنی صبر ایوب میخواست! ولی استریمینگ اومد گفت: “داداش، لازم نیست این همه منتظر بمونی! همزمان که دارم فایل رو برات میفرستم، تو هم شروع کن به دیدن.” مثل شیر آب میمونه؛ تا بازش میکنی، آب میاد، لازم نیست صبر کنی کل تانکر پر بشه بعد بری آب بخوری!
این روزا دیگه همه چی استریم شده: از لایوهای اینستاگرام و توییچ گرفته تا فیلم و سریال دیدن روی پلتفرمهای VOD (مثل فیلیمو و نماوا خودمون). پس اگه تو هم به نوعی با محتوای ویدیویی سر و کار داری، دیر یا زود پات به دنیای استریمینگ باز میشه. و اینجا، FFmpeg میشه رفیق گرمابه و گلستانت!
FFmpeg چطوری وارد بازی استریمینگ میشه؟
FFmpeg مثل یه سرآشپز ماهر میمونه که مواد اولیه (فایل ویدیویی خام شما) رو میگیره و به یه غذای خوشمزه و آمادهی سِرو (استریم قابل پخش) تبدیل میکنه. کارهایی که FFmpeg تو این مسیر انجام میده ایناست:
- اینکودینگ (Encoding): فرض کن ویدیوی خام شما مثل یه عالمه مواد اولیه جدا از همه. اینکودینگ میاد اینا رو به یه فرمت فشرده و قابل فهم برای پلیرها تبدیل میکنه (مثلاً با کدک H.264 که خیلی معروفه). این کار باعث میشه حجم ویدیو کم بشه و راحتتر روی اینترنت جابجا بشه. FFmpeg استاد اینکود کردنه و کلی کدک مختلف رو ساپورت میکنه.
- **ماکسینگ (Muxing) یا بستهبندی: حالا که صدا و تصویر آماده شدن، باید اینا رو با هم توی یه “بسته” یا “کانتینر” مناسب برای استریم قرار بدیم. این بسته همون فرمت نهایی استریم شماست (مثلاً برای HLS میشه فایلهای .ts و یه فایل .m3u8). FFmpeg این کار رو هم مثل آب خوردن انجام میده.
- ارسال (Streaming Out): بعد از آمادهسازی، FFmpeg میتونه این بسته رو با استفاده از پروتکلهای مختلف به یه سرور استریم (مثل Nginx با ماژول RTMP یا سرورهای مخصوص HLS/DASH) بفرسته، یا حتی خودش مستقیماً به عنوان یه سرور ساده عمل کنه.
- دریافت و پردازش استریم (Streaming In): برعکسش هم ممکنه! FFmpeg میتونه یه استریم زنده رو از یه آدرس اینترنتی بگیره، پردازش کنه (مثلاً روش واترمارک بزنه، فرمتش رو عوض کنه، یا ذخیرهاش کنه).
آشنایی با چند تا از پروتکلهای معروف استریمینگ که FFmpeg باهاشون رفیقه:
-
RTMP (Real-Time Messaging Protocol):
- چی هست؟ یه پروتکل قدیمیتر ولی همچنان پرکاربرد، مخصوصاً برای ارسال استریم از نرمافزارهای استریمینگ (مثل OBS) به سرور. خیلی از پلتفرمهای لایو استریم مثل توییچ و یوتیوب هنوز از RTMP برای دریافت ورودی استفاده میکنن.
- FFmpeg چیکار میکنه؟ میتونی با FFmpeg ویدیوت رو اینکود کنی و مستقیم به یه سرور RTMP بفرستی. مثلاً:
Bash
ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://your-stream-server/live/stream_key
این دستور میگه: “آهای FFmpeg، فایل
input.mp4
رو با سرعت پخشش (-re
) بخون، ویدیو رو باlibx264
و صدا رو باaac
اینکود کن، و در نهایت با فرمتflv
(که برای RTMP مناسبه) بفرستش به این آدرس RTMP.”
-
HLS (HTTP Live Streaming):
- چی هست؟ این پروتکل کار شرکت اپل هست و خیلی خیلی محبوبه، چون تقریباً روی همه دستگاهها (مخصوصاً آیفون و مک) و مرورگرها کار میکنه. HLS ویدیو رو به تیکههای کوچیک (معمولاً چند ثانیهای) تبدیل میکنه و یه فایل لیست پخش (playlist) با پسوند
.m3u8
هم کنارش میذاره که به پلیر میگه این تیکهها رو از کجا و به چه ترتیبی برداره و نشون بده. اینطوری میتونه کیفیت رو هم متناسب با سرعت اینترنت کاربر تنظیم کنه (Adaptive Bitrate Streaming). - FFmpeg چیکار میکنه؟ FFmpeg خوراکش درست کردن استریم HLS هست. هم میتونه از یه فایل ورودی، خروجی HLS بسازه و هم یه استریم زنده رو به HLS تبدیل کنه. مثلاً برای ساختن HLS از یه فایل:
Bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls output.m3u8
اینجا
-hls_time 10
میگه هر تیکه ۱۰ ثانیه باشه و-hls_list_size 0
هم میگه کل تیکهها رو توی لیست نگه دار (برای ویدیوهای ضبط شده). برای لایو، این مقادیر فرق میکنه.
- چی هست؟ این پروتکل کار شرکت اپل هست و خیلی خیلی محبوبه، چون تقریباً روی همه دستگاهها (مخصوصاً آیفون و مک) و مرورگرها کار میکنه. HLS ویدیو رو به تیکههای کوچیک (معمولاً چند ثانیهای) تبدیل میکنه و یه فایل لیست پخش (playlist) با پسوند
-
MPEG-DASH (Dynamic Adaptive Streaming over HTTP):
- چی هست؟ اینم یه پروتکل استاندارد و مدرن برای استریمینگ تطبیقی مثل HLS هست، با این تفاوت که توسط یه کنسرسیوم بزرگتر توسعه داده شده و سعی کرده بهترینهای هر دو دنیا رو داشته باشه. DASH هم ویدیو رو به قطعات کوچیک تقسیم میکنه و یه فایل مانیفست (معمولاً با پسوند
.mpd
) داره. - FFmpeg چیکار میکنه؟ بله، FFmpeg از پس DASH هم برمیاد و میتونه براتون استریم DASH تولید کنه. دستورش یه کم پیچیدهتر از HLS میتونه باشه چون گزینههای بیشتری داره، ولی شدنیه!
Bash
ffmpeg -re -i input.mp4 -map 0 -map 0 -c:a aac -c:v libx264 -b:v:0 800k -b:v:1 300k \ -s:v:0 1280x720 -s:v:1 640x360 -profile:v:1 baseline -profile:v:0 main \ -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 \ -ar:a:1 22050 -use_timeline 1 -use_template 1 \ -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \ -f dash output.mpd
این یه مثال نسبتاً کامل برای ساخت دو کیفیت مختلف از ویدیو برای DASH هست. نگران جزئیاتش نباش، مهم اینه که بدونی FFmpeg این کاره هم هست!
- چی هست؟ اینم یه پروتکل استاندارد و مدرن برای استریمینگ تطبیقی مثل HLS هست، با این تفاوت که توسط یه کنسرسیوم بزرگتر توسعه داده شده و سعی کرده بهترینهای هر دو دنیا رو داشته باشه. DASH هم ویدیو رو به قطعات کوچیک تقسیم میکنه و یه فایل مانیفست (معمولاً با پسوند
چند تا نکته و ترفند خودمونی با FFmpeg برای استریمینگ:
-re
یادت نره! وقتی داری یه فایل رو برای استریم زنده میفرستی (مثلاً به RTMP)، حتماً از آپشن-re
قبل از-i inputfile
استفاده کن. این به FFmpeg میگه که فایل رو با نرخ فریم واقعی خودش بخونه و بفرسته، وگرنه یهو کل فایل رو با سرعت نور میفرسته و سرور بیچاره هنگ میکنه!- کدکهای مناسب انتخاب کن: برای ویدیو معمولاً
libx264
(برای H.264) یاlibx265
(برای H.265/HEVC که جدیدتر و بهینهتره ولی شاید همه جا ساپورت نشه) و برای صداaac
گزینههای خوبی هستن. - حواست به بیتریت (Bitrate) باشه: بیتریت یعنی مقدار دادهای که در هر ثانیه برای ویدیو ارسال میشه. هرچی بالاتر، کیفیت بهتر ولی حجم هم بیشتر و نیاز به اینترنت قویتر. باید یه تعادل خوب پیدا کنی.
- برای HLS و DASH، سرور وب هم لازمه: فایلهای خروجی HLS (.m3u8 و .ts) و DASH (.mpd و قطعات مدیا) فایلهای معمولی هستن و باید روی یه وب سرور (مثل Nginx یا Apache) قرار بگیرن تا پلیرها بتونن از طریق HTTP بهشون دسترسی داشته باشن.
- تست، تست، و باز هم تست: همیشه خروجی استریمت رو روی دستگاهها و با سرعتهای اینترنت مختلف تست کن تا مطمئن بشی همه چی ردیفه.
جمعبندی و حرف آخر:
خب رفقای ویدپروتکت، دیدید که FFmpeg چقدر میتونه تو دنیای استریمینگ ویدیو کمکمون کنه. از تبدیل فرمت و آمادهسازی ویدیو گرفته تا ارسال و دریافت استریم با پروتکلهای جور واجور، این غول دوستداشتنی همیشه یه راهی جلو پات میذاره.
شاید اولش دستوراتش یه کم ترسناک به نظر برسن، ولی قول میدم با یه کم تمرین و سر و کله زدن باهاش، قلق کار دستتون میاد. دنیای FFmpeg خیلی بزرگه و این مقاله فقط یه نوک کوچولو از کوه یخ بود. ولی امیدوارم همینقدر هم بهتون کمک کرده باشه که با دید بازتر و اعتماد به نفس بیشتری سراغ پروژههای استریمینگتون برید.