1. 程式人生 > >#後端筆記#在CentOS上利用 nginx + nginx-rtmp-module 搭建基於HLS協議的直播伺服器

#後端筆記#在CentOS上利用 nginx + nginx-rtmp-module 搭建基於HLS協議的直播伺服器

一、直播協議簡介:

搭建之前,先簡單說說現在網上主流的直播協議:

1、RTMP:

     實時訊息傳輸協議,Real Time Messaging Protocol,是 Adobe Systems 公司為 Flash 播放器和伺服器之間音訊、視訊和資料傳輸開發的開放協議。協議基於 TCP,是一個協議族,包括 RTMP 基本協議及 RTMPT/RTMPS/RTMPE 等多種變種。RTMP 是一種設計用來進行實時資料通訊的網路協議,主要用來在 Flash/AIR 平臺和支援RTMP協議的流媒體/互動伺服器之間進行音視訊和資料通訊。這種方式的實時性比較強,基本能保證延遲在1-2s內,是現在國內直播主要採用的方式之一;不過使用這種協議,就必須安裝flash,而H5、IOS、Android並不能原生支援flash,因此這種協議能流行多久,就不得而知了,畢竟移動端才是現在的主流。

2、HLS:

     hls是Apple推出的直播協議,是通過視訊流切片成檔案片段來直播的。客戶端首先會請求一個m3u8檔案,裡面會有不同位元速率的流,或者直接是ts檔案列表,通過給出的ts檔案地址去依次播放。在直播的時候,客戶端會不斷請求m3u8檔案,檢查ts列表是否有新的ts切片。這種方式的實時性較差,不過優勢是H5、IOS、Android都原生支援。

3、HTTP-FLV:

      HTTP-FLV就是對RTMP協議的封裝,相比於RTMP,它是一個開放的協議。因此他具備了RTMP的實時性和RTMP不具備的開發性,而且隨著flv.js出現(感謝B站),使得瀏覽器在不依賴flash的情況下,播放flv視訊,從而相容了移動端,所以現在很多直播平臺,尤其是手機直播平臺,都會選擇它。

 

二、HLS直播配置

1、nginx伺服器配置:

     由於nginx-rtmp-module也支援HLS協議,因此我們可以直接在nginx.conf進行配置:(上篇博文介紹了基於rtmp協議的直播和nginx直播伺服器的搭建,這裡就直接跳過了,想了解nginx伺服器搭建的可以點選這裡

在rtmp配置那裡新增一個應用hls:

application hls {
            live on;
            hls on;
            hls_path /usr/local/vod/hls;#視訊流存放地址
            hls_fragment 5s;
            hls_playlist_length 15s;
            hls_continuous on; #連續模式。
            hls_cleanup on;    #對多餘的切片進行刪除。
            hls_nested on;     #巢狀模式。
        }

在http裡新增一個直播流存放的地址:

location /hls {  #新增視訊流存放地址。
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        #訪問許可權開啟,否則訪問這個地址會報403
        autoindex on;
        alias /usr/local/vod/hls;#視訊流存放地址,與上面的hls_path相對應,這裡root和alias的區別可自行百度
        expires -1;
        add_header Cache-Control no-cache;
        #防止跨域問題
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';  
    }

設定了這個地址對映後,訪問http://ip:8091/hls就可以看到存放在伺服器上的ts切片檔案和m3u8檔案了,伺服器的實際地址對應的就是alias的地址。autoindex記得一定要置成on,這樣才有許可權訪問直播檔案,否則直播就無法成功(我被這個坑,坑了兩天!)

這樣hls的配置基本就完成了,記得設定後重啟伺服器。

2、直播推流配置

      推流指的就是直播端將視訊流推到設定的伺服器位置。這裡我使用的是obs進行推流:

    

URL中“hls”對應的就是conf檔案中設定的application名稱,流名稱可自定義,伺服器端生成的m3u8檔案就是以此命名的。設定完成之後,點選“開始推流”,推流端的設定就完成了。

3、直播拉流的配置

     拉流指的就是將視訊流從伺服器拉取到客戶端進行播放。這裡我是將視訊拉流到網頁上進行顯示,程式碼如下:

(這裡直接截圖了,要原始碼的話,網上有很多,直接copy下來就行了)

注意拉流的地址是http開頭的,並且要帶上nginx伺服器對應的埠號。

4、測試效果:

OK!HLS直播完成!

現在已經攻克了RTMP協議和HLS協議,下面還將研究一下HTTP-FLV,現在很多直播平臺都是這種模式了,也是直播的發展去世了,趕緊了解起來!