最近在做直播項目,查閱了一下相關資料然后成功搭建服務,在這里整理記錄下實現過程以及踩過的坑。
一、直播協議簡介:
首先,在搭建服務之前先了解下目前主流的幾個直播協議:
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直播配置
nginx服務器配置:
新建目錄:用於存放nginx以及nginx-rtmp-moudle模塊
mkdir /usr/local/nginx
下載壓縮包:進入到創建的nginx目錄下下載,這里如果下載不成功可以把https改為http,之前一直可以下載,后面換了一台雲服務器后https就下載不了了,不知道是不是被屏蔽的原因,換成http后解決了
cd /usr/local/nginxwget http://nginx.org/download/nginx-1.12.2.tar.gzwget https://codeload.github.com/arut/nginx-rtmp-module/zip/master
如果沒有wget命令的話執行下面的命令安裝
apt -y install wget
解壓:
tar -zxvf nginx-1.12.2.tar.gzunzip nginx-rtmp-module-master.zip
同理,沒有unzip命令的執行下面命令安裝
apt -y install unzip
安裝nginx以及安裝nginx模塊之前,先安裝一些依賴庫:
apt -y install gcc-c++ apt -y install pcre pcre-devel apt -y install zlib zlib-devel apt -y install openssl openssl-devel
然后進行nginx-rtmp-module模塊的安裝:
cd /usr/local/nginx/nginx-1.12.2#完成rtmp模塊安裝,=后面輸入你的模塊包的絕對路徑./configure --add-module=/usr/local/nginx/nginx-rtmp-module-mastermake&make install
使用以下命令查看nginx是否啟動成功:
cd /usr/local/nginx/sbin./nginx -t
出現下圖提示時表示配置成功
nginx以及相關模塊安裝完成
配置及啟動服務支持hls
由於nginx-rtmp-module支持hls協議,因此我們可以直接在nginx.conf進行配置:
vi /usr/local/nginx/conf/nginx.conf
加入以下內容rtmp模塊:(rtmp{}的內容和http{}為同級,位置不要放錯)
rtmp { server { listen 1935; #監聽的端口 chunk_size 4000; application hls { live on; hls on; hls_path /usr/local/html/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/html/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'; }
如圖:
設置好之后保存文件然后重啟服務器:
cd /usr/local/nginx/sbin./nginx -s reload
直播推流配置
推流指的就是直播端將視頻流推到設定的服務器位置。這里我使用的是obs進行推流:
在設置->串流 中填寫信息:URL為 rtmp://xxx:1935/hls,xxx為你的服務器的IP地址,hls是用來存放流媒體的,”對應的就是conf文件中設置的application名稱,流名稱可自定義,服務器端生成的m3u8文件就是以此命名的。設置完成之后,點擊“開始推流”,推流端的設置就完成了。
三、拉流設置
觀看直播就比較簡單了,可以簡單的使用h5的vedio標簽就可以觀看了。
可以訪問http://xxx:80/hls/abcd.m3u8來觀看直播,其中xxx為你的服務器IP地址,后面的abcd就是在推流時候使用的秘鑰,是自定義的。或者使用
<video> <source src="http://xxx:80/hls/abcd.m3u8"/> <p class="warning">Your browser does not support HTML5 video.</p> </video>
在此處遇到一個小坑,上述訪問地址我是根據網上資料來寫的,但是在我自己實際使用時發現服務器把推流時使用的密鑰自動生成一個目錄,然后把流文件存放到了里面,並不是直接生成abcd.m3u8,如下圖
所以我使用的訪問地址是http://xxx:80/hls/abcd/index.m3u8,然后就成功拉到直播流了。
經測試上面方法延時很大,要20-40秒延時,如果要實時性好網站調用地址應該改為rtmp://192.168.188.172/hls/abcd
cctv1流地址 http://cctvalih5ca.v.myalicdn.com/live/cctv1_2/index.m3u8