目前市場上的產品主要分爲兩種:一種是像花椒、映客、鬥魚、YY等的泛娛樂化直播,一種是思科、聲網之類的實時互動直播。一般情況下實時互動直播會與PSTN網絡相連,所以實時互動直播必須達到電話級別的傳輸要求,一般不超過400ms。
泛娛樂化直播架構
在泛娛樂化直播架構中有信令服務器集羣來負責創建房間、聊天、贈送禮物…,當直播端需要直播時直接向信令服務器發送請求,信令服務器向請求端返回推流的地址,然後直播端開始像CDN網絡推送數據流(流媒體CDN與傳統CDN有些不同),然後當觀衆需要觀看直播時,使用同樣的方式請求直播地址,然後在流媒體CDN拉取數據流,具體如圖所示:
實時互動直播架構
衆所周知,實時互動直播架構對傳輸效率要求高,因此客戶端使用UDP協議向媒體服務器推流,由於要保證服務器7x24小時的服務,所以通過私有網絡建立了服務器集羣,直播端向媒體服務器推流。由於使用了多個直播服務節點,所以需要控制中心來控制這些節點以達到負載均衡、健康評估等的目的。每個節點通過內總線向控制中心發送心跳包,控制中心通過心跳包來分析服務節點的健康狀況來做出相應的決策。使用內總線的原因一是爲了數據的安全性,二是爲了數據的時效性。那麼有時候實時互動也需要多人觀看,所以上面講解的泛娛樂化直播架構與實時互動直播架構進行融合。在CDN流媒體網絡與內總線之間有一層服務節點最重要的作用是將直播端的RTP轉換爲RTMP數據向CDN推流,由此得知內總線的主要作用就是提高數據吞吐量和保證數據實時安全,具體如下圖所示:
流媒體CDN網絡與傳統CDN網絡
雖然各大CDN廠商都提供CDN服務,但是流媒體CDN與傳統CDN網絡有很大的差別,但是要弄明白區別首先要了解什麼是CDN:CDN就是內容分發網絡的簡稱,主要用來加速用戶訪問數據的速度和承載源站點大部分訪問壓力。一個CDN網絡大致上分爲三層:
- 邊緣節點:用戶訪問邊緣節點,邊緣節點在主幹接點拉去數據。
- 主幹接點:是邊緣節點與源站點的中間層,負責分發源站點的內容到邊緣節點。
- 源站點:內容提供商的服務器集羣。
具體見下圖:
一般情況下,內容提供商有多個服務器來負載均衡,並且CDN提供區域的CDN邊緣節點來提供服務,衆多的邊緣節點和源節點之間通過主幹節點連接,主幹節點之間一般通過光纖直接互聯,如下圖所示:
通過上文介紹,我們已經清楚CDN網絡基本架構,那麼傳統CDN與流媒體CDN的區別是:
傳統CDN網絡是客戶端請求某一站點的數據,首先請求源站點的數據,如果源站點有數據就直接返回,如果沒有就會直接通過主幹節點請求源站點直接返回,並且邊緣節點緩存該數據以便下一次客戶端去請求加速,也就是說傳統CDN網絡有
熱點數據
這一說。流媒體CDN網絡採用的推送+拉去的數據分發策略,也就是內容提供商將數據推送到主幹節點,然後邊緣節點在主幹節點拉取數據,用戶請求邊緣節點的數據拉取數據流。
搭建一個簡單的直播系統
ffmpeg
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視頻的完整解決方案。
ffplay
ffplay是一個使用了 ffmpeg 和 sdl 庫的、一個簡單的可移植的媒體播放器。
Nginx
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行,同時Nginx也支持流媒體服務。
Step.1 安裝Nginx服務器和RTMP模塊:
brew install nginx-full --with-rtmp-module
Step.2 配置Nginx服務:
# 文件路徑:/usr/local/etc/nginx/nginx.conf
vim /usr/local/etc/nginx/nginx.conf
# 修改配置文件:
rtmp {
server {
listen 1935;
chunk_size 4096; # 傳輸數據塊的大小
# 創建了一個應用
application live {
live on;
record off; # 關閉錄製
allow play all;
}
}
}
# 熱加載配置文件:
nginx -s reload
Step.3 推流到服務器
ffmpeg -re -i ***帝國-矩陣危機.mp4 -c copy -f flv rtmp://127.0.0.1/live/hacker-three
Step.4 拉取數據
ffmpeg -i rtmp://127.0.0.1/live/hacker-three -c copy dump.flv
ffplay rtmp://127.0.0.1/live/hacker-three