直播疑難雜症排查(1)— 播放失敗

本文是 《直播疑難雜症排查》系列的第一篇文章,我們從播放開始,因為觀看直播最重要的一個環節就是打開播放器,很多問題的直接反饋也是來自觀眾端。

導致播放失敗的原因,有很多種,不一定是播放器本身的問題,不過通過播放器,我們很容易反過來排查服務端或者推流端的問題。下面我們會從播放失敗的表現、播放問題排查工具、常見問題分析等多個方面展開討論。

1. 播放失敗的表現

播放失敗的表現總結下來包括但不限於以下這些:

- 界面上一直顯示 「載入中」,或者提示播放失敗的錯誤

- 播放畫面卡死不動,但 UI 按鈕可以點擊

- 有聲音沒有畫面,有畫面沒有聲音

這裡並不討論如播放卡頓、音畫不同步、馬賽克、延時、花屏等問題,這些話題,我們將會在後續的文章中探討,本文重點關注的是:為啥無法順利 「打開」 直播流 ?

2. 播放問題的排查工具

一旦我們遇到視頻播放不了,第一件事,就是要找幾個別的播放器也播放看看,做一下對比測試,或者對碼流做一些基礎分析,以便更好的定位問題的源頭,而各個平台比較常見的播放/分析工具有如下幾個:

2.1 命令行工具

ffplay,ffprobe,mediainfo,hls-analyzer 等

2.2 網頁端工具

http://www.cutv.com/demo/live_test.swf

http://www.ossrs.net/players/srs_player.html

2.3 App 應用

vlc,vplayer,mxplayer 等

2.4 Windows 工具

mp4info,FlvParse,FLVMeta,Elecard StreamEye Studio 等

3. 常見播放失敗問題排查

3.1 基礎概念

從給播放器傳入播放地址,到播放畫面顯示出來,一般有如下幾個步驟:

- 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

3.2 域名解析失敗

如果播放地址的域名無法解析,會導致播放失敗,一般斷網了或者域名無效,則播放的時候,會有類似如下報錯:

$ ffplay rtmp://live.hkstv.hk.lxdns.com1/live/hksFailed to resolve hostname live.hkstv.hk.lxdns.com1: nodename nor servname provided, or not knownFailed 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.m3u8http://www.w3school2.com.cn1/i/movie.m3u8: Operation timed out$ ffplay http://www.w3school2.com.cn1/i/movie.mp4http://www.w3school2.com.cn1/i/movie.mp4: Invalid data found when processing input

遇到這類錯誤,一般可以通過 ping 一下域名試試,看看是否可以 ping 通,如果 ping 不通,則可能要檢查下域名解析的配置了。

3.3 伺服器連接失敗

如果域名正確,並且有網路連接的狀態,多半是可以正常解析出伺服器 ip 地址的,但是依然有連接失敗的可能,比如,這台伺服器相應的服務掛掉了,或者並沒有在相應的埠提供服務,從而導致播放器連接失敗,類似問題的報錯如下:

$ ffplay rtmp://http://www.jhuster.com/live/hksCannot open connection tcp://http://www.jhuster.com:1935rtmp://http://www.jhuster.com/live/hks: Operation timed out

因為 Jhuster 對應的伺服器並沒有提供 rtmp 拉流服務,因此通過 1935 連接該伺服器會失敗。

$ ffplay https://www.w3school.com.cn/i/movie.mp4Connection to tcp://http://www.w3school.com.cn:443 failed: Connection refused

因為 w3school 在線教程 並不支持 https 訪問,因此通過 443 介面請求 https 連接失敗

當然,也有可能是這台伺服器雖然提供了 rtmp 拉流服務但是宕機了,因此,我們需要通過 dig 命令確定最終訪問的是哪一台伺服器,並排查下該伺服器為什麼無法連接,當然,最好是修改下 ffpmeg 源碼,把解析出來的伺服器 ip 地址列印出來,這樣就可以直接看到所連接的伺服器地址了。

3.4 請求的資源不存在

對於 http 協議的直播地址,請求的播放資源不存在,返回的錯誤還是比較快的,比如:

$ ffplay http://jhuster.com/live/hks.mp4http://jhuster.com/live/hks.mp4: Server returned 404 Not Found$ ffplay http://www.w3school2.com.cn/i/movie2.mp4http://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/hks1rtmp://live.hkstv.hk.lxdns.com/live/hks1: Input/output error

3.4 不支持的格式

視頻流的採用的網路協議、編碼格式、封裝格式有很多種,網路協議比如 http/https/rtmp/rtsp 等等,編碼格式比如 h.264,mpeg4,aac,speex 等等,封裝格式比如 flv,mp4,avi,rmvb 等等,這些協議和格式的流,都是需要播放器專門添加支持的,因此,播放器遇到不支持的協議或者格式,也會導致播放失敗,如下所示:

https://www.jhuster.com/xxxx.mp4 Protocol not foundhttp://www.jhuster.com/xxxx.rmvb Invalid data found when processing input

3.5 只有音頻沒有視頻,或者只有視頻沒有音頻

出現該錯誤的原因可能有如下幾點:

- 音頻/視頻的編碼格式不支持,導致解碼失敗

- 音頻/視頻的數據內容異常,導致解碼失敗

- 基於 ffmpeg 的播放器的 `probesize` 設置太小,導致解析碼流信息不足

- 碼流/文件本身的前半段只有音頻沒有視頻,或者只有視頻沒有音頻

這個問題播放啟動流程已經完成,只是出現了畫面缺失、或者音頻缺失,也算是一種播放失敗,限於本文篇幅,該問題後面會抽出專門的章節來分析。

3.6 其他播放失敗

上面只分析了常見的播放失敗問題,其實導致播放失敗的原因還有千千萬萬種,這裡無法一一都列出來,不過通過 ffplay 的報錯,就知道大概的原因,再聯合服務端一起調試調試,一般都是可以找到根本原因的。下面是 ffmpeg 常見的錯誤分類:

http://ffmpeg.org/doxygen/trunk/error_8h_source.html

4. 小結

關於播放失敗的問題排查就介紹到這裡了,有任何疑問歡迎來信 lujun.hust@gmail.com 交流,歡迎關注我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。
推薦閱讀:

在線答題風口已穩,創新力將成未來競爭的基石和護城河
韋神4AM虎牙首秀29殺吃雞,彈幕爆炸:五五開一人頂一個戰隊!
萬眾期待的吃雞主播大戲,就這樣被官方截胡了
阿怡(劉佳怡)如何有力的證明自己不是代打?她為什麼不去證明?

TAG:音视频 | 直播 | 播放器 |