一:音視頻直播架構介紹
(一)直播產品種類
泛娛樂化直播:大規模直播(沒有互動),多為觀看,可以使用該架構。支持rtmp、hls、http/flv
實時互動直播:使用了RTP協議,與目前的學習協議不同;常用webrtc
(二)泛娛樂化直播架構
1.主播端發送信令到信令服務器,創建房間,返回房間地址 。
2.主播向獲取的房間地址推流
3.也是主播端,同1,只是協議不同
4.同2
5.觀眾端要觀看節目,也需要發送信令給信令服務器。獲取到主播節目的媒體流的地址。
6.觀眾端獲取了主播節目流地址,就可以去流媒體雲中去拉流。贊賞、聊天,發送給信令服務器處理。
(三)實時互動直播架構
左互動(內部用戶互動)
右收聽(提供大規模用戶直播架構)
(四)直播客戶架構
(五)流媒體服務搭建介紹
1.有多種搭建方式:下面介紹3種
1.使用Nginx搭建本地流媒體服務器
2.通過SRS搭建RTMP server;實現流媒體服務器網絡集群
3.CDN網絡(現成的,商業化的),自己會擴容
2.介紹Nginx
二:本機搭建Nginx RTMP服務
(一)下載資源
1.nginx源碼:http://nginx.org/en/download.html
tar -xvf nginx-1.19.10.tar.gz
2.下載ginx-rtmp-module:https://github.com/arut/nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
(二)RTMP環境搭建
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module
prefix指定安裝路徑,add-module添加新模塊。
make -j 4
-j開啟多進程編譯。
sudo make install
(三)配置環境
修改nginx下的配置文件nginx.conf
#rtmp服務 rtmp { server { #指定服務端口 listen 1935; chunk_size 4000; #RTMP協議中需要 #指定流應用:名稱自定義 application mytv { live on; #直播 allow play all; #允許直接進行播放 } } }
(四)啟動服務
sudo ./sbin/nginx -c conf/nginx.conf
(五)推/拉流測試
1.監聽頻道,進行拉流
ffplay rtmp://localhost/mytv/room01 #mytv是起的流應用名稱;room01是自定義頻道
也可以保存:
ffmpeg -i rtmp://localhost/mytv/room01 -c copy out2.flv
2.進行推流
ffmpeg -re -i ./out.flv -c copy -f flv rtmp://localhost/mytv/room01
注意:在直播系統中不可能直接讓用戶知道視頻流地址,所以需要一個信令服務器進行資源管理!!
三:SRS流媒體服務
(一)SRS介紹
github地址:https://github.com/ossrs/srs
(二)單機部署SRS服務器
1.下載源碼
git clone https://gitee.com/winlinvip/srs.oschina.git srs &&
cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git &&
git checkout 3.0release && git pull
2.配置與編譯
./configure --prefix=/usr/local/srs
make -j 4
3.安裝
sudo make install
conf:存放配置信息,比如srs.conf、origin.cluster.edge.conf邊緣結點配置
etc:存放腳本(可以設置自動啟動)
objs:編譯好的程序,也有日志
srs.conf
# main config for srs. # @see full.conf for detail config. listen 1935; #偵聽端口 max_connections 1000; #支持最大連接數 srs_log_tank file; #日志輸出形式 srs_log_file ./objs/srs.log; #日志存放位置 daemon on; http_api { enabled on; listen 1985; } http_server { enabled on; listen 8080; dir ./objs/nginx/html; } stats { network 0; disk sda sdb xvda xvdb; } vhost __defaultVhost__ { hls { enabled on; } http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } }
origin.cluster.edge.conf:配置邊緣節點與源站之間的關系
edge.conf:配置邊緣節點
# the config for srs origin-edge cluster # @see https://github.com/ossrs/srs/wiki/v1_CN_Edge # @see full.conf for detail config. listen 1935; max_connections 1000; pid objs/edge.pid; vhost __defaultVhost__ { cluster { mode remote; origin 127.0.0.1:19350; #配置源站信息 } }
4.啟動
./objs/srs -c conf/srs.conf
5.測試(同前面的nginx測試)
(三)RTMP中的URL與VHOST
1.RTMP URL
標准RTMP URL指的是最大兼容的RTMP URL,基本上所有的服務器和播放器都能識別的URL,和HTTP URL其實很相似,例如:
HTTP | Schema | Host | Port | App | Stream |
---|---|---|---|---|---|
http://192.168.1.10:80/players/srs_player.html | http | 192.168.1.10 | 80 | players | srs_player.html |
rtmp://192.168.1.10:1935/live/livestream | rtmp | 192.168.1.10 | 1935 | live | livestream |
其中:
- Schema:協議頭,HTTP為HTTP或HTTPS,RTMP為RTMP/RTMPS/RTMPE/RTMPT等眾多協議,還有新出的RTMFP。
- Host:主機,表示要連接的主機,可以為主機DNS名稱或者IP地址。商用時,一般不會用IP地址,而是DNS名稱,這樣可以用CDN分發內容(CDN一般使用DNS調度,即不同網絡和地理位置的用戶,通過DNS解析到的IP不一樣,實現用戶的就近訪問)。
- Port:端口,HTTP默認為80,RTMP默認為1935。當端口沒有指定時,使用默認端口。
- Path:路徑,HTTP訪問的文件路徑。
- App:RTMP的Application(應用)名稱,可以類比為文件夾。以文件夾來分類不同的流,沒有特殊約定,可以任意划分。
- Stream:RTMP的Stream(流)名稱,可以類比為文件。
2.Vhost
RTMP的Vhost和HTTP的Vhost概念是一樣的:虛擬主機。詳見下表(假設域名demo.srs.com被解析到IP為192.168.1.10的服務器):
HTTP | Host | Port | Vhost |
---|---|---|---|
http://demo.srs.com:80/players/srs_player.html | 192.168.1.10 | 80 | demo.srs.com |
rtmp://demo.srs.com:1935/live/livestream | 192.168.1.10 | 1935 | demo.srs.com |
Vhost主要的作用是:
- 支持多用戶:當一台服務器需要服務多個客戶,譬如CDN有cctv(央視)和wasu(華數傳媒)兩個客戶時,如何隔離他們兩個的資源?相當於不同的用戶共用一台計算機,他們可以在自己的文件系統建立同樣的文件目錄結構,但是彼此不會沖突。
- 域名調度:CDN分發內容時,需要讓用戶訪問離自己最近的邊緣節點,邊緣節點再從源站或上層節點獲取數據,達到加速訪問的效果。一般的做法就是Host是DNS域名,這樣可以根據用戶的信息解析到不同的節點。
- 支持多配置:有時候需要使用不同的配置,考慮一個支持多終端(PC/Apple/Android)的應用,PC上RTMP分發,Apple和Android是HLS分發,如何讓PC延遲最低,同時HLS也能支持,而且終端播放時盡量地址一致(降低終端開發難度)?可以使用兩個Vhost,PC和HLS;PC配置為最低延遲的RTMP,並且將流轉發給HLS的Vhost,可以對音頻轉碼(可能不是H264/AAC)后切片為HLS。PC和HLS這兩個Vhost的配置肯定是不一樣的,播放時,流名稱是一樣,只需要使用不同的Host就可以。
listen 1935; vhost show.cctv.cn { chunk_size 128; } vhost show.wasu.cn { chunk_size 4906; }
nginx配置虛擬主機vhost的方法詳解
(四)SRS集群部署
1.部署圖
源節點:
兩個邊緣節點:
開啟集群:
sudo ./objs/srs -c conf/origin.conf sudo ./objs/srs -c conf/edge.conf sudo ./objs/srs -c conf/edge2.conf
推流/拉流測試:
ffmpeg -re -i ./out.flv -c copy -f flv rtmp://127.0.0.1:1935/mytv/room01
ffplay rtmp://127.0.0.1:1936/mytv/room01
四:CDN了解
(一)CDN
(二)阿里雲架構