上海2017年4月26日電 /美通社/ -- 七牛直播云在 2016 年 6 月發(fā)布之后,幫助廣大客戶解決過(guò)形形色色的問(wèn)題,如直播卡頓、馬賽克、花屏、黑屏、雜音、音畫(huà)不同步等,這其中,有一些是網(wǎng)絡(luò)原因,有一些是開(kāi)發(fā)者的使用姿勢(shì)問(wèn)題,有一些是參數(shù)配置錯(cuò)誤,當(dāng)然,也有一些是 SDK 本身的問(wèn)題。近日,七牛云盧俊就直播技術(shù)中的各類播放失敗問(wèn)題進(jìn)行了專業(yè)解析,以下為解析原文:
總結(jié)下來(lái),如果開(kāi)發(fā)者能夠?qū)χ辈ヮI(lǐng)域的一些基礎(chǔ)知識(shí)有更深入的了解,掌握一些基本的排障手段,很多問(wèn)題是能夠很快自行解決的,甚至也能夠更好地防患于未然。
因此,繼《直播技術(shù)詳解》系列文章之后,我們推出了這個(gè)新的系列《直播疑難雜癥排查》,我們會(huì)把協(xié)助客戶解決直播問(wèn)題的經(jīng)驗(yàn)逐步分享出來(lái),同時(shí)也會(huì)穿插一些音視頻開(kāi)發(fā)的基礎(chǔ)知識(shí)和優(yōu)化經(jīng)驗(yàn),希望能夠幫助到直播領(lǐng)域的開(kāi)發(fā)者們。
第一篇文章我們從播放開(kāi)始,因?yàn)橛^看直播重要的一個(gè)環(huán)節(jié)就是打開(kāi)播放器,很多問(wèn)題的直接反饋也是來(lái)自觀眾端。
導(dǎo)致播放失敗的原因有很多種,不一定是播放器本身的問(wèn)題,不過(guò)通過(guò)播放器,我們很容易反過(guò)來(lái)排查服務(wù)端或者推流端的問(wèn)題。下面我們會(huì)從播放失敗的表現(xiàn)、播放問(wèn)題排查工具、常見(jiàn)問(wèn)題分析等多個(gè)方面展開(kāi)討論。
播放失敗的表現(xiàn)
播放失敗的表現(xiàn)總結(jié)下來(lái)包括但不限于以下這些:
界面上一直顯示“加載中”,或者提示播放失敗的錯(cuò)誤;
播放畫(huà)面卡死不動(dòng),但 UI 按鈕可以點(diǎn)擊;
有聲音沒(méi)有畫(huà)面,有畫(huà)面沒(méi)有聲音。
這里并不討論如播放卡頓、音畫(huà)不同步、馬賽克、延時(shí)、花屏等問(wèn)題,這些話題,我們將會(huì)在后續(xù)的文章中探討,本文重點(diǎn)關(guān)注的是:為啥無(wú)法順利“打開(kāi)”直播流 ?
播放問(wèn)題的排查工具
一旦我們遇到視頻播放不了,第一件事,就是要找?guī)讉€(gè)別的播放器也播放看看,做一下對(duì)比測(cè)試,或者對(duì)碼流做一些基礎(chǔ)分析,以便更好地定位問(wèn)題的源頭,各個(gè)平臺(tái)比較常見(jiàn)的播放/分析工具有如下幾個(gè):
命令行工具:ffplay、ffprobe、mediainfo、hls-analyzer 等
網(wǎng)頁(yè)端工具
http://www.cutv.com/demo/live_test.swf
http://www.ossrs.net/players/srs_player.html
App 應(yīng)用:VLC,VPlayer,MXPlayer 等
Windows 工具:mp4info、FlvParse、FLVMeta、Elecard StreamEye Studio 等
常見(jiàn)播放失敗問(wèn)題排查
基礎(chǔ)概念
從給播放器傳入播放地址,到播放畫(huà)面顯示出來(lái),一般有如下幾個(gè)步驟:
DNS 解析,將播放地址中的域名解析為對(duì)應(yīng)的服務(wù)器 IP 地址;
連接服務(wù)器,完成 http 請(qǐng)求或者 rtmp 握手過(guò)程;
接收服務(wù)器發(fā)送的數(shù)據(jù),解協(xié)議解封裝,拿到音視頻數(shù)據(jù)解碼播放。
任何一個(gè)環(huán)節(jié)出了問(wèn)題,都有可能導(dǎo)致播放失敗,不同的協(xié)議,由于協(xié)議層原因,播放報(bào)錯(cuò)往往不太一樣,我們下面的討論,主要以 RTMP/HTTP 這兩種協(xié)議為主,假設(shè)正常的播放測(cè)試地址如下:
香港衛(wèi)視的 RTMP 直播流:rtmp://live.hkstv.hk.lxdns.com/live/hks
W3C School 的測(cè)試 mp4 流:http://www.w3school.com.cn/i/movie.mp4
域名解析失敗
如果播放地址的域名無(wú)法解析,會(huì)導(dǎo)致播放失敗,一般斷網(wǎng)了或者域名無(wú)效,則播放的時(shí)候,會(huì)有類似如下報(bào)錯(cuò):
$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
當(dāng)然,如果有網(wǎng)絡(luò),但是域名解析失敗,一般 ISP 運(yùn)營(yíng)商可能會(huì)返回一些類似 404 頁(yè)面,或者跳轉(zhuǎn)到其他的默認(rèn)網(wǎng)頁(yè),因此,對(duì)于 HLS,HTTP-FLV,HTTP-mp4 等碼流,會(huì)因?yàn)樽x到一些「臟數(shù)據(jù)」從而返回一些其他的錯(cuò)誤,例如:
$ 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
遇到這類錯(cuò)誤,一般可以通過(guò) ping 一下域名試試,看看是否可以 ping 通,如果 ping 不通,則可能要檢查下域名解析的配置了。
服務(wù)器連接失敗
如果域名正確,并且有網(wǎng)絡(luò)連接的狀態(tài),多半是可以正常解析出服務(wù)器 ip 地址的,但是依然有連接失敗的可能,比如,這臺(tái)服務(wù)器相應(yīng)的服務(wù)掛掉了,或者并沒(méi)有在相應(yīng)的端口提供服務(wù),從而導(dǎo)致播放器連接失敗,類似問(wèn)題的報(bào)錯(cuò)如下:
$ ffplay rtmp://www.jhuster.com/live/hks
Cannot open connection tcp://www.jhuster.com:1935
rtmp://www.jhuster.com/live/hks: Operation timed out
因?yàn)?www.jhuster.com 對(duì)應(yīng)的服務(wù)器并沒(méi)有提供 rtmp 拉流服務(wù),因此通過(guò) 1935 連接該服務(wù)器會(huì)失敗。
$ ffplay https://www.w3school.com.cn/i/movie.mp4
Connection to tcp://www.w3school.com.cn:443 failed: Connection refused
因?yàn)?www.w3school.com.cn 并不支持 https 訪問(wèn),因此通過(guò) 443 接口請(qǐng)求 https 連接失敗。
當(dāng)然,也有可能是這臺(tái)服務(wù)器雖然提供了 rtmp 拉流服務(wù)但是宕機(jī)了,因此,我們需要通過(guò) dig 命令確定最終訪問(wèn)的是哪一臺(tái)服務(wù)器,并排查下該服務(wù)器為什么無(wú)法連接,當(dāng)然,較好是修改下 ffpmeg 源碼,把解析出來(lái)的服務(wù)器 IP 地址打印出來(lái),這樣就可以直接看到所連接的服務(wù)器地址了。
請(qǐng)求的資源不存在
對(duì)于 http 協(xié)議的直播地址,請(qǐng)求的播放資源不存在,返回的錯(cuò)誤還是比較快的,比如:
$ 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 運(yùn)營(yíng)商返回的跳轉(zhuǎn)頁(yè)面的“臟數(shù)據(jù)”,因此也有可能返回上面這種錯(cuò)誤。
而 RTMP 直播協(xié)議,跟 HTTP 協(xié)議的播放,有著一個(gè)很大的不同,就是播放器請(qǐng)求的數(shù)據(jù),并不一定“存放”在服務(wù)器,因此,服務(wù)器無(wú)法簡(jiǎn)單通過(guò) URI 定位不到則返回 404,這些數(shù)據(jù)可能是在 RTMP 握手之后,由生產(chǎn)端逐步產(chǎn)生并由服務(wù)器轉(zhuǎn)發(fā)到客戶端,因此很難簡(jiǎn)單判斷說(shuō)“資源不存在”。
通常 RTMP 協(xié)議的直播流,如果推流端沒(méi)有推流了,播放器這邊一般是讀數(shù)據(jù)超時(shí)后才會(huì)返回錯(cuò)誤,例如:
$ ffplay rtmp://live.hkstv.hk.lxdns.com/live/hks1
rtmp://live.hkstv.hk.lxdns.com/live/hks1: Input/output error
不支持的格式
視頻流的采用的網(wǎng)絡(luò)協(xié)議、編碼格式、封裝格式有很多種,網(wǎng)絡(luò)協(xié)議比如 http/https/rtmp/rtsp 等等,編碼格式比如 h.264,mpeg4,aac,speex 等等,封裝格式比如 flv,mp4,avi,rmvb 等等,這些協(xié)議和格式的流,都是需要播放器專門添加支持的,因此,播放器遇到不支持的協(xié)議或者格式,也會(huì)導(dǎo)致播放失敗,如下所示:
https://www.jhuster.com/xxxx.mp4 Protocol not found
https://www.jhuster.com/xxxx.rmvb Invalid data found when processing input
只有音頻沒(méi)有視頻,或者只有視頻沒(méi)有音頻
出現(xiàn)該錯(cuò)誤的原因可能有如下幾點(diǎn):
音頻/視頻的編碼格式不支持,導(dǎo)致解碼失敗
音頻/視頻的數(shù)據(jù)內(nèi)容異常,導(dǎo)致解碼失敗
基于 ffmpeg 的播放器的"probesize"設(shè)置太小,導(dǎo)致解析碼流信息不足
碼流/文件本身的前半段只有音頻沒(méi)有視頻,或者只有視頻沒(méi)有音頻
這個(gè)問(wèn)題播放啟動(dòng)流程已經(jīng)完成,只是出現(xiàn)了畫(huà)面缺失、或者音頻缺失,也算是一種播放失敗,限于本文篇幅,該問(wèn)題后面會(huì)抽出專門的章節(jié)來(lái)分析。
其他播放失敗
上面只分析了常見(jiàn)的播放失敗問(wèn)題,其實(shí)導(dǎo)致播放失敗的原因還有很多種,這里無(wú)法一一都列出來(lái),不過(guò)通過(guò) ffplay 的報(bào)錯(cuò),就可能知道大概的原因,再聯(lián)合服務(wù)端一起調(diào)試調(diào)試,一般都是可以找到根本原因的。