不少直播都是基於 CDN 來實現的。而經過聲網的服務,或基於聲網SDK與 CDN 結合,還能夠實如今直播中的連麥互動、白板同步等強調實時性的場景。本文源自社區投稿,介紹了該場景下的一些基礎知識。如你們存有疑問,能夠與做者交流。html
對於直播業務場景,你們遇到問題時候得到的第一現場大多數都是從CDN觀衆端感覺到,好比拉流發現主播卡了,有雜音,模糊,不出圖等一類現象。在排查這類問題時候,其實從範圍上講,咱們須要從兩部分去排查。咱們實時音視頻雲結合CDN直播構建的場景以下圖所示:web
左邊是聲網實時音視頻雲部分,右邊是轉推到CDN部分。問題上報點觀察到的現象是在右邊觀衆端。那很明顯問題可能發生在聲網A區也可能發生在B區。瀏覽器
因此爲了確認範圍,能夠先了解排查下B區。緩存
那對於實時音視頻開發的同窗可能對CDN不是很瞭解。這篇短文主要目的是介紹下CDN,CDN直播有關的一些基礎知識和概念,已經簡單的問題排查方式。服務器
你們使用CDN雲廠商的一個基礎就是雲存儲,雲存儲是對象存儲。首先,一個文件包含了了屬性(術語叫metadata,元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(如下簡稱數據)。對象存儲區別於塊存儲(DAS,SAN)和文件存儲(NAS系統,NFS,CIFS),核心是將數據通路(數據讀或寫)和控制通路(元數據)分離,構成鍵值對,訪問時候經過key訪問。因此雲存儲訪問時候能夠經過HTTP協議post,get請求經過key值去下載數據訪問。網絡
雲錄製服務就是經過和CDN 結合,錄製下的內容存放在雲端,雲存儲。負載均衡
存儲只是存放在一臺或多臺服務器上可是地點是單一的,若是對於用戶分佈分散業務來講,訪問確定是低效緩慢一個是I/O壓力,一個是地區偏遠的來講訪問速度慢。ide
這種狀況結合使用CDN服務能夠有效解決。post
CDN的基本原理是普遍採用各類緩存服務器,將這些緩存服務器分佈到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工做正常的緩存服務器上,由緩存服務器直接響應用戶請求。測試
1. 用戶向瀏覽器輸入 www.web.com 這個域名,瀏覽器第一次發現本地沒有dns緩存,則向網站的DNS服務器請求; 2.網站的DNS域名解析器設置了CNAME,指向了www.web.51cdn.com,請求指向了CDN網絡中的智能DNS負載均衡系統; 3.智能DNS負載均衡系統解析域名,把對用戶響應速度最快的IP節點返回給用戶; 4.用戶向該IP節點(CDN服務器)發出請求; 5.因爲是第一次訪問,CDN服務器會向原web站點請求,並緩存內容; 6.請求結果發給用戶。 CDN加速能夠作網頁加速,下載文件加速,動態加速,那和咱們音視頻相關的主要是點播加速以及CDN直播,以下圖:
CDN相關基本概念以下:
加速域名: 由用戶提供的須要被CDN加速的域名 源站地址: IP或域名,CDN節點從這裏獲取原始資源 邊緣節點:CDN分發的載體,能夠理解成離用戶最近的緩存節點 回源: CDN邊緣節點未命中時會從源站拉取資源 平臺類型: 被加速資源的類型,如WEB頁面、大文件下載、視頻點播等等 緩存策略: CDN服務器保存的一套針對用戶文件的緩存策略,根據緩存策略判斷文件是否超時須要回源 防盜鏈: 終端用戶訪問加速域名下的資源時,CDN服務器根據此配置判斷是否應該提供資源 刷新: 清除CDN緩存節點指定的文件或目錄資源 預取: 將文件資源預加載到CDN緩存節點 運營商:電信,聯通,移動,長城寬帶等區域:上海,廣東,江蘇,浙江......等 區域覆蓋:本運營商本地覆蓋,跨運營商本地覆蓋,本運營商跨區覆蓋,跨運 營商跨區覆蓋。
CDN直播是和咱們直播業務場景最緊密的部分了。借用一下阿里官網的直播圖以下,各廠商CDN直播服務都是如此。
好比我申請了域名是 abc.com,那麼在CDN那邊廠商生成的一對推拉流地址格式以下:
推流地址: rtmp://xxpull.abc.com/(直播空間名或者有些叫APPNAME)/(流名/streamname) 拉流地址有三種: rtmp://xxpull.abc.com/(直播空間名或者有些叫APPNAME)/(流名/streamname)
上面流名能夠隨時建立,一個流名就表明一組流。 咱們能夠看到拉流有三種格式:rtmp,m3u8(HLS),flv(Http-flv) 你們可能比較關心這三種拉流的區別:
協議 | HTTP-FLV | RTMP | HLS |
---|---|---|---|
全稱 | RTMP over Http | Real Time Message Protocol | HTTP Living Streaming |
傳輸層 | HTTP長連接 | TCP 長連接 | HTTP短連接 |
視頻格式 | flv | flv | TS文件(m3u8) |
原理 | 同RTMP,協議端口80 | 每一個時刻數據收到當即轉發 | 集合一段時間數據,生成ts 切片更新m3u8索引 |
延時 | 3~5s | 10~30s | 3~5s |
Web支持 | H5須要插件 | H5須要插件 | 支持 |
其餘 | 播放時須要屢次請求網絡要求高 | 須要flash,不便於seek | 跨平臺支持差須要flash插件 |
注意: 網頁端若是播放rtmp 或者flv 形式 的直播流,須要flash插件支持,因爲手機web端基本沒法調用flash插件,因此手機web端通常使用hls(即m3u8)的形式進行直播
如何選擇拉流方式: PC/Phone+直播+實時性要求高:使用flash播放RTMP。 . PC/Phone+直播+沒有實時性要求:使用RTMP或者HLS都可。 . PC/Phone+點播:使用HTTP-FLV或者HLS。 . PC/Phone+WEB+直播:想啥呢,老老實實用HLS吧。 再來看下我們的推拉流的域名地址:
rtmp://xxpull.abc.com/(直播空間名或者有些叫APPNAME)/(流名/streamname)
客戶本身提供的一級域名是abc.com,而後再CDN廠商配置後生成二級域名xxpull.abc.com(推流)和xxpull.abc.com(拉流)。
而後客戶須要本身在域名管理處本身將域名作個C記錄(CNAME)到CDN提供的域名上面去。何爲C記錄?能夠理解爲就是我域名在CDN廠商的映射別名,這樣子DNS解析後先解析到CDN廠商的CNAME而後,CNAME解析到CDN節點IP服務器推拉流。
關於上面的地址,還有一點是咱們看到有時候地址後面問號?後還有一串內容,這是鑑權。直播推拉流鑑權基本都是時間戳鑑權,時間戳+token的格式。
理解了地址接下來咱們遇到CDN集成直播推不了問題能夠先作下簡單排查,排查是不是在CDN直播部分配置相關問題。
接下來,拿出地址裏面的域名,dig/nslookup一下看下解析如何,
上圖結果是正常的,域名有C記錄對應到CDN廠商的域名,CDN廠商的域名能夠解析附近可用的CDN節點服務器IP,這個結果告訴咱們域名配置是OK的,可是配置OK不表明必定可用。接下來檢查本地訪問到的CDN節點是哪裏,以下圖
ping返回的IP 218.92.209.38, 檢查這個IP的地址以及運營商,www.ipip.net/ip.html
能夠訪問這個 [ping.huatuo.qq.com 查看本地出口IP] (ping.huatuo.qq.com查看本地出口ip/)