下面我們就進入《NGINX Plus增強能力系列專題》的首篇「視頻直播HLS與RTMP」,作者朱傑。
朱傑
F5 解決方案顧問
擁有10多年的伺服器、存儲、以及雲計算大數據的IT從業經驗,熟悉web及移動應用的開發及運維,長期致力於為客戶提供優質的服務交付。具有豐富及廣泛的行業知識,對業務的運營及運維有著深刻的理解。曾作為公有雲的高級產品經理,設計大型共有雲服務UI/UE整體架構及運營體系。
視頻點播直播有兩個關鍵詞,推流和拉流,那麼什麼是推拉流呢?推流,指的是把採集階段封包好的內容傳輸到伺服器的過程;拉流是指伺服器已有直播內容,用指定地址進行拉取的過程。
上圖清晰的說明了推拉流的過程,在上圖上豐富一下,就形成了當下主流的直播點播的架構示意圖了:
1. ngx_http_hls_module 是什麼
隨著直播行業大火,遊戲、樂秀、教育、發布會等直播類產品層出不窮,能夠滿足各方人員的需求。國內常見的直播協議有幾個:RTMP、HLS、HTTP-FLV,下面我們來介紹一下RTMP與HLS。
RTMP,全稱 Real Time Messaging Protocol,即實時消息傳送協議。Adobe 公司為 Flash 播放器和伺服器之間音視頻數據傳輸開發的私有協議。工作在 TCP 之上的明文協議,默認使用埠 1935。協議中的基本數據單元成為消息(Message),傳輸的過程中消息會被拆分為更小的消息塊(Chunk)單元。最後將分割後的消息塊通過 TCP 協議傳輸,接收端再反解接收的消息塊恢復成流媒體數據。
RTMP 主要有以下幾個優點:RTMP 是專為流媒體開發的協議,對底層的優化比其它協議更加優秀,同時它 Adobe Flash 支持好,基本上所有的編碼器(攝像頭之類)都支持 RTMP 輸出。現在 PC 市場巨大,PC 主要是 Windows,Windows 的瀏覽器基本上都支持 Flash。另外RTMP適合長時間播放,曾經有過測試,聯繫 100 萬秒,即 10 天多連續播放沒有出現問題。最後 RTMP 的延遲相對較低,一般延時在 1-3s 之間,一般的視頻會議,互動式直播,完全是夠用的。
當然 RTMP 並沒有盡善盡美,它也有不足的地方。一方面是它是基於 TCP 傳輸,非公共埠,可能會被防火牆阻攔;另一方面,也是比較坑的一方面是 RTMP 為 Adobe 私有協議,很多設備無法播放,特別是在 iOS 端,需要使用第三方解碼器才能播放。
HLS (HTTP Live Streaming) 則是蘋果公司基於 HTTP 的流媒體傳輸協議。主要應用於 iOS 設備,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音視頻直播服務和錄製內容(點播)等服務。
相對於常見的流媒體協議,HLS 最大的不同在於它並不是一下請求完整的數據流。它會在伺服器端將流媒體數據切割成連續的時長較短的 ts 小文件,並通過 M3U8 索引文件按序訪問 ts 文件。客戶端只要不停的按序播放從伺服器獲取到的文件,從而實現播放音視頻。
相較 RTMP 而言,使用 HLS 在 HTML5 頁面上實現播放非常簡單:
<video src=」example.m3u8」 controls></video>
HLS 的優勢:
Apple 的全系列產品支持:由於 HLS 是蘋果提出的,所以在 Apple 的全系列產品包括 iPhone、 iPad、safari 都不需要安裝任何插件就可以原生支持播放 HLS, 現在 Android 也加入了對 HLS 的支持。
穿透防火牆。基於 HTTP/80 傳輸,有效避免防火牆攔截
性能高。通過 HTTP 傳輸, 支持網絡分發,CDN 支持良好,且自帶多碼率自適應,Apple 在提出 HLS 時,就已經考慮了碼流自適應的問題。
HLS 的劣勢:
在Nginx Plus 裡,Nginx_http_hls_module是專門針對HLS的擴展模塊。
1. Nginx OSS rtmp module 配置
1.1 安裝nginx依賴軟體yum -y install gcc gcc-c++ autoconf automake make
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
//首先進入local目錄
cd /usr/local
//下載nginx
wget http://nginx.org/download/nginx-1.13.12.tar.gz
//解壓
tar zxvf nginx-1.13.12.tar.gz
//創建nginx安裝目錄與模塊目錄
mkdir -p /usr/local/nginx/module
//創建視頻數據存放文件
mkdir -p /usr/local/nginx/myapp
//進入/usr/local/nginx/module目錄
cd /usr/local/nginx/module
//下載nginx-rtmp-module(沒有安裝git的請安裝,執行語句的時候沒有git會提示你)
git clone https://github.com/arut/nginx-rtmp-module.git
//下載後的文件夾名稱叫做nginx-rtmp-module
//進入解壓後的nginx目錄中,指定nginx安裝目錄並且指定了安裝的模塊
cd /usr/local/nginx-1.13.12/
./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/module/nginx-rtmp-module
//編譯並安裝
make && make instal
//啟動nginx
/usr/local/nginx/sbin/nginx
//在nginx-rtmp-module中帶有一個nginx.conf的配置文件,把它覆蓋到nginx中的配置文件
cp /usr/local/nginx/module/test/nginx.conf /usr/local/nginx/conf
詢問你是否覆蓋,輸入y 並回車
//編輯nginx配置文件,使用vim打開
vim /usr/local/nginx/conf/nginx.conf
//修改的地方一共有三處分別是
1、rtmp節點下的在live on;下加入
hls on;
hls_path /usr/local/nginx/myapp;
2、在http節點下,修改兩個root的路徑。
1.4.1 修改文件/usr/local/nginx/module/nginx-rtmp-module/test/www/index.html,修改ip以及埠。
sources: [
{
file: "rtmp://10.1.10.146:1935/myapp?carg=1/mystream?sarg=2"
}
1.4.2修改文件/usr/local/nginx/module/nginx-rtmp-module/test/www/record.html,修改ip以及埠。
var flashvars =
{
'streamer': 'rtmp://10.1.10.146:1935/myapp',
'file': 'mystream',
'type': 'camera',
'controlbar': 'bottom',
'stretching': 'none',
'frontcolor': '86C29D', // text & icons (green)
'backcolor': '849BC1', // playlist background (blue)
'lightcolor': 'C286BA', // selected text/track highlight (pink)
'screencolor': 'FFFFFF', // screen background (black)
'id': 'playerID',
'autostart': 'true'
};
重新加載配置,使用命令/usr/local/nginx/sbin/nginx -s reload;
1.5.1 下載OBS與VLC軟體;
1.5.2 打開OBS軟體,在設置中選擇串流→自定義伺服器,配置如下:
1.5.3 OBS軟體,點擊添加源,新建視頻捕捉設備;
1.5.4 點擊推流,然後在瀏覽器中輸入http://10.1.10.146:8080;
至此,服務端的推流部分完成,你會發現有趣的是,直播網頁比你obs裡的動作慢3秒,有興趣的可以去了解一下原理。
1.6.1 修改nginx.conf文件,添加點播播放目錄:
rtmp {
server {
listen 1935;
application vod {
play /usr/local/nginx/vod;
}
重啟nginx服務
#nginx -s reload
➜ scp TS.MP4 root@10.1.10.146:/usr/local/nginx/vod
1.6.3 打開VLC,進行拉流工作,打開網絡地址,配置如下:
即可正常觀看視頻文件。
ngx_http_hls_module是NGINX PLUS的模塊,他的功能主要有:
A.支持mp4,mov文件的點播;
B.支持緩存,調整緩存大小,能夠實現MP4視頻seeking功能(拖動進度條);
C.支持URI附加參數,能夠對視頻進行操作;
2.1 安裝Nginx Plus (略)2.2 配置nginx.conf文件,添加如下代碼;location / {
hls;
hls_fragment
hls_buffers
hls_mp4_buffer_size
hls_mp4_max_buffer_size 5m;
root /var/video/;
}
#nginx -s reload
http://10.1.10.146:8080/1.mp4.m3u8?offset=1.000&start=1.000&end=2.200
http://10.1.10.146:8080/1.mp4m3u8?len=8.000
http://10.1.10.146:8080/1.mp4.ts?start=1.000&end=2.200
對於直播和點播場景來說,能夠簡化配置,操作與調度視頻流,幫助視頻開發應用快速發布與運維。對於企業的數位化轉型,客戶教育,員工培訓,價值傳遞,線上獲客等具有積極作用。
OSS只有RTMP的第三方模塊,通過RTMP來實現HLS的功能
N+有HLS的獨立模塊,能夠實現在列表URI與分片URI上增加額外的參數,方便開發設計
NGINX PLUS/hls module
NGINX OSS/rtmp module
協議
http/https
rtmp/http/https
Directives
HLS 緩衝區設置
無
URL轉發參數
無
HLS 分片
無
HLS MP4 緩衝區設置
無
HLS MP4 最大緩衝區設置
無
NGINX PLUS增強模塊與指令
NGINX PLUS介紹