繼《直播技術詳解》系列文章以後,咱們推出了新的系列《直播疑難雜症排查》,咱們會把協助客戶解決直播問題的經驗逐步分享出來,同時也會穿插一些音視頻開發的基礎知識和優化經驗,但願可以幫助到直播領域的開發者們。html
《直播疑難雜症排查系列》會涵蓋的內容包括但不限於以下一些主題:node
第一篇文章咱們從播放開始,由於觀看直播最重要的一個環節就是打開播放器,不少問題的直接反饋也是來自觀衆端。服務器
致使播放失敗的緣由有不少種,不必定是播放器自己的問題,不過經過播放器,咱們很容易反過來排查服務端或者推流端的問題。下面咱們會從播放失敗的表現、播放問題排查工具、常見問題分析等多個方面展開討論。微信
###播放失敗的表現 播放失敗的表現總結下來包括但不限於如下這些:網絡
這裏並不討論如播放卡頓、音畫不一樣步、馬賽克、延時、花屏等問題,這些話題,咱們將會在後續的文章中探討,本文重點關注的是:爲啥沒法順利 「打開」 直播流 ?tcp
###播放問題的排查工具ide
一旦咱們遇到視頻播放不了,第一件事,就是要找幾個別的播放器也播放看看,作一下對比測試,或者對碼流作一些基礎分析,以便更好地定位問題的源頭,各個平臺比較常見的播放/分析工具備以下幾個:工具
###常見播放失敗問題排查 基礎概念測試
從給播放器傳入播放地址,到播放畫面顯示出來,通常有以下幾個步驟:優化
DNS 解析,將播放地址中的域名解析爲對應的服務器 IP 地址;
鏈接服務器,完成 http 請求或者 rtmp 握手過程;
接收服務器發送的數據,解協議解封裝,拿到音視頻數據解碼播放。
任何一個環節出了問題,都有可能致使播放失敗,不一樣的協議,因爲協議層緣由,播放報錯每每不太同樣,咱們下面的討論,主要以 RTMP/HTTP 這兩種協議爲主,假設正常的播放測試地址以下: 香港衛視的 RTMP 直播流:rtmp://live.hkstv.hk.lxdns.com/live/hks W3C School 的測試 mp4 流:http://www.w3school.com.cn/i/movie.mp4
域名解析失敗
若是播放地址的域名沒法解析,會致使播放失敗,通常斷網了或者域名無效,則播放的時候,會有相似以下報錯:
$ffplay rtmp://live.hkstv.hk.lxdns.com1/live/hks Failed to resolve hostname live.hkstv.hk.lxdns.com1: nodename nor servname provided, or not known Failed to resolve hostname live.hkstv.hk.lxdns.com1: No address associated with hostname
固然,若是有網絡,可是域名解析失敗,通常 ISP 運營商可能會返回一些相似 404 頁面,或者跳轉到其餘的默認網頁,所以,對於 HLS,HTTP-FLV,HTTP-mp4 等碼流,會由於讀到一些「髒數據」從而返回一些其餘的錯誤,例如:
$ ffplay http://www.w3school2.com.cn1/i/movie.m3u8 http://www.w3school2.com.cn1/i/movie.m3u8: Operation timed out $ ffplay http://www.w3school2.com.cn1/i/movie.mp4 http://www.w3school2.com.cn1/i/movie.mp4: Invalid data found when processing input
遇到這類錯誤,通常能夠經過 ping 一下域名試試,看看是否能夠 ping 通,若是 ping 不通,則可能要檢查下域名解析的配置了。
服務器鏈接失敗
若是域名正確,而且有網絡鏈接的狀態,多半是能夠正常解析出服務器 ip 地址的,可是依然有鏈接失敗的可能,好比,這臺服務器相應的服務掛掉了,或者並無在相應的端口提供服務,從而致使播放器鏈接失敗,相似問題的報錯以下:
$ ffplay rtmp://www.jhuster.com/live/hks Cannot open connection tcp://www.jhuster.com:1935 rtmp://www.jhuster.com/live/hks: Operation timed out
由於 www.jhuster.com 對應的服務器並無提供 rtmp 拉流服務,所以經過 1935 鏈接該服務器會失敗。
$ ffplay https://www.w3school.com.cn/i/movie.mp4 Connection to tcp://www.w3school.com.cn:443 failed: Connection refused
由於 www.w3school.com.cn 並不支持 https 訪問,所以經過 443 接口請求 https 鏈接失敗。
固然,也有多是這臺服務器雖然提供了 rtmp 拉流服務可是宕機了,所以,咱們須要經過 dig 命令肯定最終訪問的是哪一臺服務器,並排查下該服務器爲何沒法鏈接,固然,最好是修改下 ffpmeg 源碼,把解析出來的服務器 IP 地址打印出來,這樣就能夠直接看到所鏈接的服務器地址了。
請求的資源不存在
對於 http 協議的直播地址,請求的播放資源不存在,返回的錯誤仍是比較快的,好比:
$ ffplay http://jhuster.com/live/hks.mp4 http://jhuster.com/live/hks.mp4: Server returned 404 Not Found $ ffplay http://www.w3school2.com.cn/i/movie2.mp4 http://www.w3school2.com.cn/i/movie2.mp4: Invalid data found when processing input
注:因爲讀到 ISP 運營商返回的跳轉頁面的 「髒數據」,所以也有可能返回上面這種錯誤。
而 RTMP 直播協議,跟 HTTP 協議的播放,有着一個很大的不一樣,就是播放器請求的數據,並不必定 「存放」在服務器,所以,服務器沒法簡單經過 URI 定位不到則返回 404,這些數據多是在 RTMP 握手以後,由生產端逐步產生並由服務器轉發到客戶端,所以很難簡單判斷說 「資源不存在」。
一般 RTMP 協議的直播流,若是推流端沒有推流了,播放器這邊通常是讀數據超時後纔會返回錯誤,例如:
$ ffplay rtmp://live.hkstv.hk.lxdns.com/live/hks1 rtmp://live.hkstv.hk.lxdns.com/live/hks1: Input/output error
不支持的格式
視頻流的採用的網絡協議、編碼格式、封裝格式有不少種,網絡協議好比 http/https/rtmp/rtsp 等等,編碼格式好比 h.264,mpeg4,aac,speex 等等,封裝格式好比 flv,mp4,avi,rmvb 等等,這些協議和格式的流,都是須要播放器專門添加支持的,所以,播放器遇到不支持的協議或者格式,也會致使播放失敗,以下所示:
https://www.jhuster.com/xxxx.mp4 Protocol not found https://www.jhuster.com/xxxx.rmvb Invalid data found when processing input
只有音頻沒有視頻,或者只有視頻沒有音頻
出現該錯誤的緣由可能有以下幾點:
probesize
設置過小,致使解析碼流信息不足這個問題播放啓動流程已經完成,只是出現了畫面缺失、或者音頻缺失,也算是一種播放失敗,限於本文篇幅,該問題後面會抽出專門的章節來分析。
其餘播放失敗
上面只分析了常見的播放失敗問題,其實致使播放失敗的緣由還有不少種,這裏沒法一一都列出來,不過經過 ffplay 的報錯,就可能知道大概的緣由,再聯合服務端一塊兒調試調試,通常都是能夠找到根本緣由的。下面是 ffmpeg 常見的錯誤分類: http://ffmpeg.org/doxygen/trunk/error_8h_source.html
本文做者:盧俊@七牛雲。若是有你感興趣的問題,可是不在上述列表中,也能夠來信 lujun.hust@gmail.com 交流,歡迎關注新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。