خیلی وقت بود میخواستم یه رادیویی اینترنتی راه بندازم که بالاخره هفته قبل تونستم کمی روش کار کنم و انجامش بدم.
برای این کار به یک سرور Linux احتیاج داریم که من از Ubuntu 20.04استفاده کردم.
1- نصب Nginx و ماژول RTMP
apt update apt install ffmpeg libpcre3-dev libssl-dev zlib1g-dev git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git wget http://nginx.org/download/nginx-1.20.1.tar.gz tar -xf nginx-1.20.1.tar.gz cd nginx-1.20.1/ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=../nginx-rtmp-module make -j 1 make install
با این کار Nginx در مسیر usn/local/nginx/ نصب و آماده استفاده خواهد شد.
2- تنظیمات Nginx
اپلیکیشن Nginx تنظیمات خیلی زیادی داره که در فایل تنظیماتش ذخیره میشه. ما در این پروژه میخواهیم Nginx رو برای دریافت استریم rtmp از خود سرور و پخش روی اینترنت با پروتکلهای rtmp و hls تنظیم کنیم.
/usr/local/nginx/conf/nginx.conf:
worker_processes auto; events { worker_connections 1024; } # RTMP configuration rtmp { server { listen 1935; chunk_size 4096; allow publish 127.0.0.1; deny publish all; application live { live on; # Turn on DASH #dash on; #dash_path /tmp/dash/; #dash_fragment 10s; #dash_playlist_length 60; # Turn on HLS hls on; hls_path /tmp/hls/; hls_fragment 5s; hls_playlist_length 20; # disable consuming the stream from nginx as rtmp # deny play all; } } } http { sendfile off; tcp_nopush on; directio 512; default_type application/octet-stream; server { listen 80; location / { # Disable cache add_header 'Cache-Control' 'no-cache'; # 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/dash+xml mpd; application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp/; } } }
با این تنظیمات، Nginx یک استریم با اپلیکیشن live رو از نرمافزار ffmpeg که روی localhost اجرا میشه، دریافت میکنه و اون رو با پروتکلهای rtmp و hls پخش میکنه. پروتکل rtmp امکان پخش روی وب رو نداره و برای همین دو پروتکل hls و dash روی Nginx توسعه داده شده که تفاوتهایی باهم دارند. من اینجا از hls استفاده کردم. این پروتکل استریمی که دریافت میکنه رو به تکه فایلهای کوچک (fragment) با فرمت ts و یک playlist با فرمت m3u8 در مسیر tmp/hls/ ایجاد میکنه که قابل استفاده تو وب خواهد بود.
برای بررسی صحت فایل تنظیمات بالا دستور زیر را اجرا میکنیم:
/usr/local/nginx/sbin/nginx –t
و اگه مشکلی تو فایل تنظیمات نباشه، میشه اون رو با دستور زیر اجرا کرد:
/usr/local/nginx/sbin/nginx
دقت کنید برای اینکه بعد از هر بار بوت شدن سرور دوباره Nginx اجرا بشه یا باید اون رو به service تبدیل کرد و یا باید دستور بالا به فایل etc/rc.local/ اضافه بشه.
3- اسکریپ
برای اینکه رادیو بصورت اتوماتیک و مداوم پخش داشته باشه و با اضافه و کم کردن فایلهای صوتی، مشکلی پیش نیاد، من این اسکریپت رو نوشتم و اونو به crontab اضافه کردم:
/home/cron.sh:
#!/bin/bash echo 'ffconcat version 1.0' > /home/RadioPlaylist for audio in /home/RadioFiles/*.mp3 do echo 'file' "'$audio'" >> /home/RadioPlaylist done echo 'file' "'/home/RadioPlaylist'" >> /home/RadioPlaylist ps -A | grep ffmpeg if [ $? -eq 1 ] then ffmpeg -re -f mp3 -f concat -i /home/RadioPlaylist -acodec copy -ab 64k -ac 1 -f flv rtmp://localhost/live/test else echo $? fi
crontab:
*/5 * * * * /home/cron.sh
این اسکریپت دو بخش داره. در بخش اول یک فایل playlist از فایلهای صوتی موجود در مسیر home/RadioFiles/ میسازه و در بخش دوم درصورتی که ffmpeg در حال اجرا نباشه، اون رو به شکل مورد نظر برای پخش playlist بخش اول اجرا میکنه و استریم ساخته شده رو به اپلیکیشن live در Nginx میفرسته. با اجرای مکرر این فایل توسط crontab، در صورت تغییر فایلهای صوتی، playlist جدید ایجاد و پخش میشه.
با اجرای این اسکریپت اگه فایل صوتی mp3 در مسیر /home/RadioFiles/ داشته باشیم، دو استریم روی اینترنت با نشانیهای زیر شروع به پخش میکنه که توسط نرمافزارهایی مثل vlc قابل دریافت خواهد بود:
rtmp://<<Server-Url>>/live/test http://<<Server-Url>>/hls/test.m3u8
/home/RadioPlaylist:
ffconcat version 1.0 file '/home/RadioFiles/music1.mp3' file '/home/RadioFiles/music2.mp3' file '/home/RadioFiles/music3.mp3' file '/home/RadioPlaylist'
4- وب
من برای پخش این استریم در صفحات وب، از hls.js استفاده کردم.
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script > <p style="text-align:center;"><audio id="audio" controls="controls"></audio></p> <script > var audio = document.getElementById('audio'); var audioSrc = 'http://<Server-Url>>/hls/test.m3u8'; if (Hls.isSupported()) { var hls = new Hls(); hls.loadSource(audioSrc); hls.attachMedia(audio); audio.play(); } else if (audio.canPlayType('application/vnd.apple.mpegurl')) { audio.src = audioSrc; audio.play(); } </script >
امیدوارم این نوشته مفید باشه.