ممکن است شما دوربین مدار بسته ای داشته باشید که خروجی تصویر آن UDP باشد، و یا حتی اینکودر قدیمی و ساده ای داشته باشید که فقط ویدیو ها را به پروتکل UDP نمایش دهد در این حالت شما فقط در شرایط خاصی میتوانید این ویدئو ها را تماشا کنید. ما در این پست روش تبدیل پروتکل UDP به RTMP و HLS برای تماشای ساده تر در کامپیوتر و موبایل و یا حتی ارسال آن به سرویس های پخش زنده نظیر یوتیوب و فیس بوک و آپارات لایو آموزش میدهیم.
پروتکل UDP از پروتکل های قدیمی و رایج استریم میباشد. این پروتکل به دلیل درگیری و تأخیر کمتر در شبکه محبوبیت خاص خودش رو در بین استریم کار ها داره ولی با این حال به بخاطر ماهیتش، پروتکل نا امنی در ارسال محسوب میشه و این یعنی اینکه شما ممکنه در تصویر هاتون ریزش پیکسل، قطعی لحظه ای و ... داشته باشید. که این مشکلات در شبکه اینترنت به دلیل وجود روتر های زیاد، بیشتر خواهد شد که شما میتوانید با تبدیل به پروتکل های دیگر که بر پایه ی TCP هستند این مشکلات را حل کنید.
بزودی، من در پستی دیگر مفصلا به تعریف این پروتکل، خواهم پرداخت.
مقدمه و پیش نیازها
برای شروع، شما نیاز به یک سرور لینوکس یا ویندوز با قدرت بالا برای تبدیل تصاویر دارید. پیشنهاد من اولا لینوکس و دوما توضیع Ubuntu هست. به دلیل اینکه اولا در نسخه ویندوز تعدادی از قابلیت های ماژول nginx-rtmp از جمله execs که در این پست باهاش کار داریم غیر فعال شده و دوما استفاده از توضیع اوبونتو Ubuntu به دلیل اینکه بسته های مولتی مدیای زیادی براش نوشته شده.
انتخاب RAM و CPU سرور به خودتون و اسکیل کاری تون بستگی داره که با یکم آزمون و خطا میتونید بهش برسید.
بعد از تهیه سرور شما نیاز به ffmpeg و nginx دارید. به تصویر زیر نگاه کنید:
همانطور که در تصویر بالا پیداست، شما با استفاده از ffmpeg ویدئوهای لایو و زنده live stream با پروتکل udp را به rtmp تبدیل، و با ماژول nginx-rtmp نصب شده در nginx آن را به پروتکل های rtmp و hls قابل نمایش برای کاربران تبدیل میکنید.
در صورتی که با ffmpeg و نحوی کار آن، آشنا نیستید میتوانید این پست را مطالعه فرمایید.
نصب در لینوکس Ubuntu
در ابتدا شما باید nginx را به همراه ماژول rtmp در سرور نصب کنید. آموزش نصب این ماژول را میتوانید در وبلاگ با لینک راه اندازی استریمینگ سرور RTMP و HLS با NginX مطالعه کنید.
بعد از نصب و اجرای nginx باید فایل nginx.conf را با دستور زیر باز کرده و تنظیمات مربوط به اجرای ffmpeg برای تبدیل پروتکل ها را وارد کنید.
ali@linux$ sudo nano /usr/local/nginx/conf/nginx.conf
در این فایل شما باید تنظیمات خود را بین کروشه server {} در داخل کروشه rtmp {} قبل از application موجود اضافه نمایید. در این application ما از قابلیت exec_static استفاده میکنیم. این قابلیت در هنگام اجرای سرویس اجرا خواهد شد.
application iptv_backend { live on; allow publish 127.0.0.1; deny publish all; exec_static ffmpeg -loglevel error -re -threads 0 -i udp://239.192.1.1:1234 -tune zerolatency -preset ultrafast -profile:v main -level 4.0 -c:v libx264 -vf yadif=0:-1:0 -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost:1935/iptv/ch01 2>>/var/log/http/ffmpeg-ch01.log; respawn on; exec_kill_signal 9; respawn_timeout 10s; } application iptv { live on; allow publish 127.0.0.1; deny publish all; hls on; hls_type live; hls_path /tmp/hls; hls_fragment 5s; hls_playlist_length 60s; }
در دستور بالا با استفاده از ffmpeg یک آدرس udp مالتی کست multicast را تبدیل و اپلیکیشن دیگر در همین سرور به نام iptv ارسال میکنیم. در اپلیکیشن iptv نیز تنظیمات hls را فعال کردیم و میتوانیم با تنظیمات قبلی هر دو لینک rtmp و hls را با آدرس های زیر تماشا کنید:
RTMP >>> rtmp://ip_server:1935/iptv/ch01
HLS >>> http://ip_server/hls/ch01.m3u8
همچنین درصورتی کدک و فرمت تصویر تبدیل شده توسط اینکودر استاندارد mp4/h.264 و قابل پخش در rtmp باشد برای مصرف cpu کمتر میتوانید دستور زیر را جایگذین دستور بالا در ffmpeg کنید:
exec_static ffmpeg -loglevel error -re -threads 0 -i udp://239.192.1.1:1234 -tune zerolatency -c:v copy -c:a copy -bsf:a aac_adtstoasc -f flv rtmp://localhost:1935/iptv/ch01 2>>/var/log/http/ffmpeg-ch01.log;
نصب در ویندوز
برای نصب و اجرای nginx در ویندوز میتوانید به لینک زیر مراجعه کنید: راه اندازی سرور پخش زنده RTMP و HLS با NginX در ویندوز
از آنجایی که قابلیت execs در نسخه ویندوز این ماژول nginx-rtmp ساپورت نمیشود باید از راه های دیگر برای اجرای دائمی ffmpeg استفاده کرد. برای اجرای ffmpeg از فایل bat اسکریپت استفاده میکنیم و برای اجرای دائمی آن میتوان با nssm اسکریپت را به سرویس تبدیل کرد.
برای ایجاد فایل bat یک نوت پد باز کرده و مقادیر زیر را داخل آن کپی میکنید:
@echo off cls :start C:/ffmpeg/bin/ffmpeg -loglevel error -re -threads 0 -i udp://239.192.1.1:1234 -tune zerolatency -preset ultrafast -profile:v main -level 4.0 -c:v libx264 -vf yadif=0:-1:0 -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost:1935/iptv/ch01 goto start
سپس نوپد را با نام ffmpeg-udp.bat ذخیره کرده و فایل آن را در ریشه محل نصب nginx قرار میدهیم. دقت فرمایید محل فایل ffmpeg.exe را بصورت صحیح وارد کرده باشید. همچنین دقت کنید فایل دقیقا با پسوند bat ذخیره شده باشد.
اکنون با اجرای آن استریم اجرا خواهد شد. درصورتی که بخواهید فایل با روشن شدن ویندوز همانند سرویس اجرا شود، nssm نصب شده در محل نصب nginx را به صورت زیر اجرا میکنیم:
ali@windows$ cd c:\nginx
ali@windows$ nssm install ffmpeg-udp
با دستور بالا پنجره ای باز میشود که مقادیر آن را بصورت زیر وارد کنید همچنین در صورتی که نیاز به فایل های logs داشته باشید تب I/O را کامل کنید.
در پایان روی Install Service کلیک کنید. هم اکنون فایل bat شما بصورت سرویس نصب شده است و هر وقت ویندوز اجرا شود این برنامه نیز اجرا خواهد شد.
در محله بعد فایل nginx.conf موجود در شاخه conf در محل نصب nginx در آدرس (C:\nginx\conf\nginx.conf) را با نوت پد یا یک ادیتور دیگر باز کرده و تنظیمات زیر را بین کروشه server {} در داخل کروشه rtmp {} قبل از application موجود اضافه نمایید:
application iptv { live on; allow publish 127.0.0.1; deny publish all; hls on; hls_type live; hls_path temp/hls; hls_fragment 5s; hls_playlist_length 60s; }
سپس فایل stop.bat را در ریشه محل نصب nginx اجرا کرده و nginx را مجددا باز نمایید. و یا اگر به عنوان سرویس nginx را نصب کردید به task manager ویندوز رفته و ذر تب service، سرویس nginx را کلیک راست کرده و ریستارت کنید. دقت فرمایید بعد از اجرای این قسمت فایل ffmpeg-udp.bat میتواند استریم را ارسال کند. همچنین درصورتی که فایل ffmpeg-udp.bat را بعنوان سرویس اضافه کرده باشید در قسمت service از task manager باید آن را کلیک راست و start نمایید.
امیدوارم این مطلب براتون مفید بوده باشه.
سلام
راه حلی وجود داره که وقتی کاربر با استفاده از hls می خواهد استریم را دریافت کند من در سرور بین سورس فیلم و nginx باشم و هر فایل ts که می خواهد رد شود را با استفاده از ffmpeg یا هر چیز دیگه ای بتونم ویرایش کنم . ویرایش در حد این که یک فیلتری روش اعمال کنم یا چیزی روش بنویسم؟
باتشکر
بهتره این کار رو قابل از ساخته شدن فایل های ts انجام بدید.
شما استریم رو به یه اپلیکیشن بفرستید و اون اپلیکیشن تغییرات رو با exec_push و ffmpeg انجام بده و به اپلیکیشن دیگه بفرسته . در اپلیکیشن نهایی شما hls رو روشن و تنظیم کنید.
سلام علیکم
من می خوام در nginx وقتی استریم شروع میشه
اولا یه فایل php اجرا بشه
ثانیا یه فایل bat با محتوای ffmpeg اجرا بشه
ممنون میشم راهنمایی بفرمایید
باسلام
برای اجرای یک php باید آدرسش رو با on_publish قرار دهید و برای اجرای فایل bat آدرس فایل را با exec_push قرار دهید.
exec_push cron_job.bat;
on_publish http://localhost/job.php;
در ضمن ویندوز از exec پشتیبانی نمیکند.
سلام
ممنون میشم یه توضیح در پیاده سازی سیستم نمایش در یوتیوب و اپارات بهم بدین.
میخوام وقتی کاربر کیقیت ویدو رو انتخاب میکنه تغییر کنه.اما من تو اموزش هاتون ندیدم توضیح بدین و اینکه چه پلیری باید استفاده کنم برای نمایش تبلیغ؟
باسلام
این یک قابلیتی است به نام ABR که در این رابطه بزودی مطلبی خواهم گذاشت.