آموزش مرحله به مرحله راه اندازی یک استریم سرور رایگان با پروتکل های RTMP و HLS که جزو رایج ترین پروتکل های استریمینگ (Streaming) بصورت زنده (Live) و تعاملی (VOD) در سیستم عامل لینوکس نسخه Ubuntu 18.04.
از موارد کاربردی این استریم سرور میتوان به راه اندازی یک سرور پخش زنده اینترنتی، برای دریافت و انتشار پخش زنده، اصطلاحا همان تلویزیون اینترنتی؛ و یا راه اندازی یک وبسایت انتشار ویدیو، با قابلیت جلوگیری از دانلود؛ نام برد.
مقدمه
استریمینگ مدیا (Streaming media) و یا محتوای جاری به رسانه ای گفته میشود که همزمان با ارسال توسط گیرنده قابل نمایش است. به بیان دیگر برای تماشای فایل گیرنده نیاز ندارد تمامی فایل را دانلود کند تا بتواند آن را مشاهده نماید بلکه فرستنده میتواند فایل را بصورت جاری ارسال کند و گیرنده آن را تماشا کند. مثال آن پخش زنده های تلویزیون های اینترنتی صدا و سیما.
استریمینگ سرور (Streaming Server) به سروری گفته میشود که سرویس های مبتنی بر جریان زنده (استریمینگ Streaming) اعم از صوتی و تصویری یا زنده و تعاملی را ارائه میدهد. از رایج ترین پروتکل های جریان زنده میتوان RTMP و HLS و MMS (این پروتکل ربطی به MMS دریافتی در گوشی ندارد) را نام برد که هم اکنون در سایت های معروفی همچون یوتیوب و آپارات و پخش زنده اینترنتی سایت صدا و سیما استفاده میشود.
پروتکل RTMP که مخفف شده ی (Real-Time Messaging Protocol) میباشد ساخته و پرداخته شرکت Macromedia سازنده Flash است که هم اکنون تحت انحصار شرکت Adobe میباشد. این پروتکل در ابتدا برای جریان زنده صدا و تصویر روی بستر اینترنت بین یک فلش پلیر و سرور ایجاد شد که بعدها با استقبال عمومی مواجه و در اکثر دستگاه های خانگی و حرفه ای و اکثر پلیر ها اعم از موبایل و سیستم های مختلف استفاده شد. پرت پیشفرض این پروتکل 1935 است و برای استفاده آن در مرورگر وب باید از فلش پلیر استفاده نمود.
پرتکل HLS مخفف شده (HTTP Live Streaming) است. این پروتکل توسط شرکت Apple برای استفاده جریان زنده در پلیر QuickTime و سیستم عامل های OS X و iOS موبایل و مرورگر Safari نوشته شده که هم اکنون در فایرفاکس، گوگل کروم و مرورگر جدید ماکروسافت Microsoft Edge پیاده سازی شده. این پروتکل با تبدیل جریان زنده بصورت فایل های تکه ای قابلیت پخش آن را در تمامی مرورگر ها با تگ < video > مقدور کرده است، این فایل های تکه ای در یک فایل M3U playlist ذخیره شده. بر این اساس آدرس دهی این پروتکل با این پسوند تمام میشود. به دلیل استفاده از پروتکل HTTP در این پروتکل اغلب نیازی به تنظیم Firewall در مبدا و مقصد نیست و از پروکسی ها براحتی عبور میکند که تمامی اینها راحتی استفاده برای کاربران را به همراه دارد.
همچنین از ویژگی های خوب این پروتکل استفاده از قابلیت adaptive bitrate streaming میباشد. با استفاده از این قابلیت میتوان پهنای باند کاربر را شناسایی کرده و جریان زنده ای متناسب با پهنای باندش برای آن ارسال کرد.
موارد مورد نیاز
شما برای این کار باید یک سرور (یا سرور مجازی) با پهنای باند بالا برای دریافت و پخش استریم برای کاربران تهیه نمایید.
سیستم عامل توصیه شده Ubuntu Server 18.04 میباشد. در صورتی که میخواهید این آموزش را روی سیستم عامل های دیگر مانند ویندوز امتحان کنید با مراجعه به این لینک آموزش را بصورت تصویری مطالعه کنید.
درصورتی که قصد استفاده از قابلیت ABS و یا Transcoding را دارید نیاز به رم و CPU بالایی دارید.
برای نصب نیاز به کاربر ریشه (root) یا کاربر با سطح دسترسی sudo دارید.
شروع نصب
برای کمپایل Nginx و Nginx-RTMP نیاز به ابزار و برنامه هایی دارید که با دستور زیر نصب خواهد شد:
ali@linux$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
در صورتی که قصد Transcoding و Re-encoding دارید بسته زیر را نیز نصب نمایید:
ali@linux$ sudo apt-get install software-properties-common
ali@linux$ sudo add-apt-repository ppa:jonathonf/ffmpeg-4
ali@linux$ sudo apt-get update
ali@linux$ sudo apt-get install ffmpeg x264 x265
برای بررسی اینکه ffmpeg بدرستی نصب شده است:ali@linux$ ffmpeg -version
ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
...
فولدری ایجاد کرده و فایل ها را در آنجا دانلود نمایید:
ali@linux$ mkdir nginx
ali@linux$ cd nginx
بسته nginx را با دستور زیر دانلود کنید :
ali@linux$ wget https://nginx.org/download/nginx-1.14.2.tar.gz
شما میتوانید لینک دانلود آخرین نسخه Nginx را از سایت nginx: download دریافت کنید و متناسب با آن، لینک بالا را تغییر دهید. بهتر است از ورژن پایدار Stable استفاده نمایید.همچنین آخرین نسخه از بسته nginx-rtmp را با دستور زیر دانلود کنید:
ali@linux$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
درصورتی که ابزار zip را ندارید میتوانید با دستور زیر آن را نصب کنید:ali@linux$ sudo apt-get install unzip
همچنین شما باید بسته ها را Extract کنید:ali@linux$ tar -zxvf nginx-1.14.2.tar.gz
ali@linux$ unzip master.zip
وارد فولدر nginx برای شروع عملیات نصب شوید:ali@linux$ cd nginx-1.14.2
قبل از نصب بسته باید ماژول nginx-rtmp-module به آن اضافه کنید:
ali@linux$ ./configure --with-http_ssl_module --without-http_gzip_module --add-module=../nginx-rtmp-module-master
برای کمپایل و نصب بسته دستور های زیر را وارید کنید:ali@linux$ make
ali@linux$ sudo make install
حال شما میتوانید Nginx را با نصب و تنظیم بسته nginx-init-ubuntu بصورت سرویس استفاده کنید:ali@linux$ sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
ali@linux$ sudo chmod +x /etc/init.d/nginx
ali@linux$ sudo update-rc.d nginx defaults
هم اکنون Nginx شما همراه با RTMP نصب شده و میتوانید استفاده کنید.
برای تنظیم پروتکل HLS باید مراحل زیر را انجام دهید:
ابتدا فولدری با نام HLS در دریشه Nginx میسازید.
ali@linux$ sudo mkdir /usr/local/nginx/hls
سپس در فایل nginx.conf که موجود در فولدر conf در محل نصب برنامه است، را باز میکنیم.برای باز کردن این فایل شما میتوانید با nano این کار را انجام دهید، درصورتی که nano ندارید میتوانید با دستور زیر آن را نصب کنید:
ali@linux$ sudo apt-get install nano
سپس فایل nginx.conf را با دستور زیر باز کرده و تمام محتویات آن را پاک میکنیم.ali@linux$ sudo nano /usr/local/nginx/conf/nginx.conf
بعد از پاک کردن تمامی تنظیمات قبلی، تنظیمات جدید زیر را وارد میکنیم:
#user nobody; worker_processes 1; error_log logs/rtmp_error.log debug; pid logs/nginx.pid; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location /hls { # Serve HLS fragments # CORS setup add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; # allow CORS preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } } } rtmp { server { listen 1935; chunk_size 8192; application hls { live on; meta copy; hls on; hls_path /tmp/hls; } } }
برای جایگذاری (Past) تنظیمات در putty کافی است در صفحه خالی nano کلیک راست کنید. برای ذخیره تنظیمات در ویرایشگر nano باید کلید های Crtl+X را زده و برای تایید حرف Y را زده و با تایید نام فایل آن را ذخیره کنید.
هم اکنون HLS شما نیز تنظیم شد و با راه اندازی مجدد nginx شما میتوانید از آن استفاده کنید. برای راه اندازی مجدد از دستور زیر استفاده کنید:
ali@linux$ sudo service nginx restart
همچنین برای ارسال و دریافت Stream دو مورد امنیتی است که باید روی سرور تنظیم شود.
ابتدا برای دریافت استریم از RTMP نیاز دارید که فایروال (Firewall) را تنظیم کنید. معمولا فایروال در Ubuntu بصورت پیش فرض فعال نیست. برای تنظیم و فعال سازی آن دستورات زیر را وارد کنید:
ali@linux$ sudo ufw limit ssh
ali@linux$ sudo ufw allow 80
ali@linux$ sudo ufw allow 1935
ali@linux$ sudo ufw enable
مبحث بعدی بحث اجازه دسترسی از راه دور به منابع یا همان CORS است که برای HLS کاربردی است. شما باید اجازه دسترسی به فایل ها را از خارج از سرور به کاربران بدهید.
برای ایجاد دسترسی باید فایل crossdomain.xml را در فولدر html ساخته و اجازه ی لازم را در آن وارد کنید.
برای ایجاد فایل و باز کردن ادیتور دستور زیر را وارد کنید:
ali@linux$ sudo nano /usr/local/nginx/html/crossdomain.xml
در ادیتور nano شما باید تنظیمات زیر را past و فایل را ذخیره کنید:
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*"/> </cross-domain-policy>
هم اکنون از نظر امنیتی نیز شما میتوانید استریم را ارسال و تماشا نمایید.
ارسال و تماشای پخش زنده
برای ارسال پخش زنده شما باید استریم خود را با پروتکل RTMP به nginx ارسال کرده و آن را با HLS و یا RTMP تماشا کنید. برای ارسال پخش زنده شما میتوانید از نرم افزار های Adobe Flash Media Live Encoder و یا Open Broadcaster Software استفاده کنید که خوش بختانه هر دوی آنها رایگان هستند.
برای دانلود برنامه Adobe Flash Media Live Encoder باید از این لینک Flash Media Live Encoder و برای دانلود OBS از لینک Open Broadcaster Software اقدام نمایید.
با استفاده از اطلاعات زیر استریم خود را ارسال نمایید:
Host : rtmp://ip_server:1935/hls
StreamName : test_ghm
در قسمت ip_server آی پی ادرس سرور خود را وارد کنید و در قسمت Stream name یک نام دلخواه وارد کنید.
برای تماشای پخش زنده میتوانید از نرم افزار VLC استفاده کنید. در منوی Media گذینه Open Network Stream را زده و در کادر URL لینک rtmp://ip_server:1935/hls/test_ghm را وارید کنید. دقت فرمایید که لینک ارسال با لینک دریافت یکی است و تفاوت آن فقط پشت سر هم بودن Host و Stream name است.
همچنین درصورتی که بخواهید با پروتکل HLS پخش زنده ارسالی را تماشا کنید باید لینک زیر را وارد کنید http://ip_server/hls/test_ghm.m3u8 که تفاوت آن با rtmp پروتکل و پرت و اپلیکیشن بعد از ادرس سرور و پسوند آخر فایل است. در آدرس فوق شما باید به جای ip_server آی پی سرور خود را وارد کنید و در قسمت test_ghm استریم نامی که در هنگام ارسال وارد کردید را وارد کنید.
درصورتی که بخواهید پخش زنده را در وبسایت خود قراردهید، پست آموزش قرار دادن پلیر HLS در وبسایت را مطالعه نمایید.
ویدیو این آموزش را نیز میتوانید در یوتیوب YouTube و آپارات تماشا کنید.
امیدوارم این آموزش براتون کاربردی باشه
آقای قائمی سلام وقتتون بخیر. عالی بود. تونستم این کار رو انجام بدم با کیفیت بسیار بالا. دستتون درد نکنه. ممنون ازانتشار مطلب وبلاگتون.
سلام ممنون از آموزش فوق العادتون.
چه طوری میشه براش مثل آپارات استریم کی تعریف کرد تا هرکسی نتونه ، محتوا به سرور ارسال بکنه .
از قابلیت Notify این ماژول باید استفاده کنید که آموزشش رو بزودی در وبلاگ قرار میدم.
با سلام شما در این آموزش با انجنیکس استفاده کردید آیا میشه از خود آپاچی هم استفاده کنیم ؟یا نه؟
اینو بگید
امکانش هست در سایت ما بدون rtmp فقط با hls وffmpegکلیپ رو نمایش بدیم
خیر، متاسفانه همچین پلاگینی در آپاچی موجود نیست.
و در مورد سوال دوم، بله پروتکل hls برای مصارف VOD نیز استفاده میشه و فقط برای پخش زنده نیست. با ffmpeg هم میشه لایو رفت که در آینده در وبلاگ آموزش میدم.
با سلام
من روی centos نصب کردم
ولی چند تا موضوع گیر افتادم
همزمان نمیشه rtmp و hls رو باهم داشته باشیم یعنی وقتی دوتا application به نام های stream و hls داشته باشیم نمیشه باهم استریم کرد ؟
نحوه پیاده سازی با rstp به چه صورت هست ؟
با تشکر
شما استریم رو روی هر اپلکیشنی بفرسید روی همون میتونید تماشا کنید مگر اینکه از قابلیت push استفاده کنید و با اون استریم رو به اپلیکیشن های دیگه بفرستید. که در پست چگونه با ارسال یک استریم به تمامی شبکه های اجتماعی پخش زنده ارسال کنیم؟ آموزش دادم.
برای اینکه hls رو در اپلیکیشنی فعال کنید لازم نیست اسم اپلیکیشن hls باشه بلكه بايد تنظیمات hls در اون اپلیکیشن روشن و اعمال شده باشه.
ماژول rtmp-nginx از پروتکل rtsp پشتیبانی نمیکنه و فقط از سه پروتکل hls و rtmp و MPEG-DASH پشتیبانی میکنه.
برای مثال عرض کردم که اسم اپ hls باشه و تنظیم hls در این اپ باشد.
پس میشه همون rtmp را دوباره به همون سرور ارسال کرد و خروجی hls گرفت؟
بله شما با مقدار push براحتی این کار رو میتونید انجام بدید.
از تبدیل rtmpبه rtsp به صورت آنلاین چطور میشه استفاده کرد؟
من تا اونجایی که فهمیدم باید از ffmpeg استفاده کرد ولی متاسفانه نتوانستم نتیجه بگیرم.
شما راه حلی دارید؟
تا اونجایی که من میدونم ffmpeg نمیتونه به عنوان یک rtsp سرور عمل کنه و فقط میتونه به یک rtsp سرور استریم ارسال کنه.
شما میتونید با استفاده از revmischa/rtsp-server یک rtsp بسازید و با ffmpeg استریمتون رو به اون ارسال کنید، که اگر نیاز داشتید اعلام کنید که آموزشش رو پست کنم.
اگر بشه RTMP رو به RTSP فرستاد و خروجی گرفت که عالی میشه.
در صورت امکان هم آموزش رو قرار بدید.
خیلی مشترک
after installation i cant connect whit OBS ( Failed connection this connection time out. make sure you ve configured a valid streaming services and no firewall is blocking the connection. ) (((((((((((((((((((((((((((((((((((((((((((((((((((((((((
من آموزش رو کامل جلو رفتم اما وقتی استریم استارت میزنم خطا میده Failed to connect to server دلیلش چی میتونه باشه؟
ممکنه مشکل از ای پی سرور و یا تنظیمات فایروال سرور شما باشد. لطفا دقت فرمایید که پرت های اعلام شده در آموزش باز شده باشد.
یکبار دیگه هم نصب کردم اما بازم همون خطا رو میده با OBS استریم می کنم
سلام وقت بخير لطفا بزرگواري بفرماييد اموزش كار با اين اموزش بفرستيد باتشكر
باسلام ، دوست عزیز آموزش های nginx-rtmp بصورت سلسله وار از طریق این وبلاگ منتشر میشود
سلام بزرگوار ، پسورد چطوری بزاریم که هر شخصی نتونه تصویر بفرسته
دوست عزیز nginx قابلیت پسورد نداره ولی با سیستم احراز هویت میتوانید جلوی ارسال استریم توسط دیگران را بگیرید :
https://ln.ghm.me/b177
میشه در خصوص nginx stub_status
و مانیتورینگ nginix در کل یک مطلب بگذارین
یا نسخه ای شامل این مورد بخصوص گذارش گیری با netdata
ممنون میشم
با سلام ممنون از آموزش کاربردیتون.
من با استفاده از دستور زیر تصویر webcam رو ارسال میکنم
ffmpeg -i /dev/video0 -f v4l2 -framerate 25 -video_size 800x600 -f flv rtmp://localhost:1935/hls/test
با استفاده از vlc میتونم rtmp رو ببینم ولی hls ساخته نشده و نمیتونم از طریق hls بهش دسترسی داشته باشم؟
باسلام
برای تماشای تصویر hls باید ادرس را بصورت http://localhost/hls/test.m3u8 در vlc باز کنید. همچنین دقت فرمایید که سطح دسترسی فولدر /tmp/hls در لینوکس باز و یا 777 باشد.
همین کارو انجام دادم ولی باز هم نشد امکان داره بخاطر فرمتی هست که ارسال میکنم؟
با ffmpeg تصویر رو با فرمت flv دارم میفرستم. آیا این فرمت درسته یا باید به فرمت دیگه ای ارسال بشه
سلام وقت بخیر ممنونم به خاطر مطالب ارزشمند شما.
یه سوالی داشتم.
این سرور با چه مشخصاتی میتونه به چند نفر استریم ارسال کنه ؟
مثلا اگه مشخصات سرور 8 گیگ رم و 4 گیگ سی پی یو باشه چند نفر میتونن استریم رونگاه کنن؟
اگه مشخصات خیلی بیشتر باشه چطور ؟
اگه من بخوام به یک میلیون نفر ارسال استریم داشته باشم میشه ؟
اینستاگرام چطوری لایو های خودش رو انجام میده ؟
اگه میشه به تعداد خیلی خیلی بالا ارسال استریم داشته باشیم.
از کجا سرور بگیریم؟ آروان خوبه ؟
پورت شبکه چقدر باید باشه ؟
میشه درباره ی سرور هم مطالبی بفرمایید ؟