直播間新手常見技術(shù)問題解答--黑屏、花屏、閃屏
黑屏、花屏、閃屏等問題,可能是推流端的問題,也可能是播放器的問題,遇到這些現(xiàn)象,我們要第一時(shí)間用別的播放器(如 VLC,ffplay)試試,如果都出現(xiàn)同樣的問題,那么多半是流本身的問題了,反之,則很可能是播放器的問題。
1 播放黑屏
現(xiàn)象:畫面是黑的,沒有圖像,但是有聲音。
2 主播端攝像頭權(quán)限問題
無論 Android 還是 iOS,App 使用攝像頭都是需要申請(qǐng)授權(quán)的,特別是 Android 6.0 以后,如果 App 層面不做專門的處理的話,很可能出現(xiàn)攝像頭權(quán)限被禁用的情況。
如果 App 沒有獲取到攝像頭權(quán)限,視頻就無法采集成功,從而導(dǎo)致推出來的流只有音頻數(shù)據(jù)。
解決方案:App 層面肯定要小心處理權(quán)限問題,檢測(cè)到未獲取相應(yīng)權(quán)限則禁止開播,或者反復(fù)提示主播授予權(quán)限。另外,可以詢問出現(xiàn)問題的主播是否有攝像頭預(yù)覽畫面,如果 App 沒有獲得權(quán)限的話,是沒有預(yù)覽畫面的。
3 主播端編碼失敗
視頻數(shù)據(jù)采集到后,下一步就是經(jīng)過編碼器,由于參數(shù)配置或者某些機(jī)型的硬編兼容性問題,很可能數(shù)據(jù)送入編碼器后,編碼失敗,并無輸出,從而導(dǎo)致沒有視頻數(shù)據(jù)送入到推流模塊。
解決方案:一般推流 SDK 都會(huì)統(tǒng)計(jì)推流的實(shí)時(shí)視頻幀率,CDN 服務(wù)端也會(huì)有一些幀率監(jiān)控,因此,如果發(fā)現(xiàn)這些統(tǒng)計(jì)得到的推流幀率為 0,同時(shí)又確定不是沒有采集到數(shù)據(jù),那么多半是編碼器的原因,可以想辦法查看下該機(jī)型的日志看看具體的報(bào)錯(cuò)信息。
4 視頻解碼失敗
當(dāng)播放器遇到不支持的視頻格式,或者數(shù)據(jù)內(nèi)容/格式異常,則會(huì)解碼失敗,從而導(dǎo)致無解碼視頻輸出。
針對(duì)不支持的格式:
? 要提前了解播放器本身支持哪些音視頻格式,如 H.264,mp4v,aac 等等,避免播放不支持的格式
? 播放器本身遇到的硬解或者軟解失敗,應(yīng)該有日志報(bào)錯(cuò),或者拋出異常給應(yīng)用層提示用戶
針對(duì)視頻數(shù)據(jù)內(nèi)容錯(cuò)誤,需要分析碼流文件本身,常見的數(shù)據(jù)內(nèi)容錯(cuò)誤導(dǎo)致的解碼失敗有如下幾種:
? 送入解碼器的幀數(shù)據(jù)不完整
? H.264 的視頻碼流,缺失了 SPS,PPS 等必要的信息頭
? iOS 的 VideoToolbox 解碼,只支持 avcc 方式打包的 H.264 數(shù)據(jù)
? 部分 Android 機(jī)型硬編出來的數(shù)據(jù)有額外的 naul 頭
? 其他等等
5 碼流的前半段只有音頻沒有視頻
這種情況,多半出自 HLS 切片產(chǎn)生的碼流,當(dāng)主播用同一個(gè)地址推流,前半段只推了音頻(可能是攝像頭權(quán)限被禁用,也可能是選擇了純音頻推流等等),然后接著又同時(shí)推了音視頻流,那么,服務(wù)端 HLS 切片產(chǎn)生的文件,就會(huì)出現(xiàn)這樣的情況。
基于 ffmpeg 的播放器,會(huì)在解析完視頻頭后初始化解碼器,因此,對(duì)于這種碼流,往往會(huì)出現(xiàn)僅有音頻或者僅有視頻播放的情況。
解決方案:從 App 端盡可能避免出現(xiàn)這種使用姿勢(shì),修改播放器的代碼,對(duì)這種碼流進(jìn)行兼容處理。
6 播放花屏/綠屏
現(xiàn)象:播放畫面出現(xiàn)圖像紊亂,大面積的異常顏色的方塊圖,或者綠屏現(xiàn)象
7 丟失參考幀導(dǎo)致的
一般 H.264 碼流有 I、B、P 三種幀類型,I 幀是關(guān)鍵幀,B 幀是雙向預(yù)測(cè)內(nèi)插編碼幀,P 幀是前向預(yù)測(cè)編碼幀。
I 幀由于是幀內(nèi)壓縮,因此可以獨(dú)立解碼播放,而 B 幀,一旦丟失了 I 幀或者后面的 P 幀,則會(huì)解碼失敗,而 P 幀一旦丟失了前面的 I/B/P 幀,也會(huì)導(dǎo)致解碼失敗。
對(duì)于丟失了參考幀而導(dǎo)致的解碼失敗,一般就會(huì)出現(xiàn)花屏的現(xiàn)象,花屏的嚴(yán)重程度依賴于丟失的參考幀對(duì)即將解碼的幀的重要程度。
那么,什么情況下會(huì)丟失參考幀呢 ?
首先,推流/播放的代碼層面,需要注意,不要丟棄編碼后、解碼前的視頻幀數(shù)據(jù),不過實(shí)際場(chǎng)景中,遇到下面的情況,難免還是會(huì)產(chǎn)生丟幀:
? 網(wǎng)絡(luò)不好,編碼后的數(shù)據(jù)發(fā)不出去
? 系統(tǒng)低內(nèi)存,隊(duì)列里面無法承受更多的幀數(shù)據(jù)
因此,在這些極端的情況下,不得不丟幀的話,最合理的策略就應(yīng)該是一次丟一整個(gè) GOP,即:一旦開始丟了一個(gè) I 幀,那么在遇到下一個(gè) I 幀之前的所有視頻幀,均丟棄掉,這樣即可有效避免播放器端產(chǎn)生解碼花屏。
8 播放器沒有從關(guān)鍵幀開始解碼
原理依然如上面所述,如果不從關(guān)鍵幀開始解碼,則必然會(huì)由于丟失了參考信息而導(dǎo)致解碼花屏。
因此,播放器,無論是首播,還是斷網(wǎng)重連后,都應(yīng)該判斷第一幀視頻是否是關(guān)鍵幀,如果不是,則應(yīng)該等到第一個(gè)關(guān)鍵幀到達(dá)之后再送入解碼器。
9 碼流中視頻尺寸發(fā)生變化
很多直播 App,橫屏直播和豎屏直播,使用的是不同的推流尺寸 ,當(dāng)主播由豎屏推流改為橫屏推流,同時(shí)又不改變推流地址的話,觀眾端拉到的流就會(huì)出現(xiàn)中間發(fā)生了視頻尺寸的變化,比如:從 848 x 480 變成了 1280 x 720 等等。
播放器需要實(shí)時(shí)檢測(cè),如果發(fā)現(xiàn)視頻尺寸發(fā)生了變化,則需要重置解碼器以及相關(guān)邏輯,否則容易出現(xiàn)解碼花屏或者出現(xiàn)內(nèi)存越界等異常。
10 硬編硬解的兼容性問題
當(dāng)然,如果使用的是 Android 硬編硬解,則難免會(huì)遇到一些比較坑爹的手機(jī),硬編硬解沒有失敗報(bào)錯(cuò),但是輸出的圖像確實(shí)異常的情況。
Android 硬編硬解的兼容性問題,代碼上小心仔細(xì),充分考慮機(jī)型的兼容性,不輕易寫死任何參數(shù),剩下能做的就是靠白名單/黑名單了。
11 推流端圖像尺寸和格式處理不當(dāng)
圖像的格式和尺寸,都是非常重要的參數(shù),一定要嚴(yán)格配置正確。
比如:如果采集到的視頻是 NV21 ,編碼器只支持 I420,那么編碼出來的圖像自然會(huì)出現(xiàn)顏色問題。
比如:在一些場(chǎng)景切換的過程中,前后攝像頭切換,視頻的尺寸可能發(fā)生了變化,但是剪裁、處理、編碼模塊沒有相應(yīng)的修改尺寸,那么,也會(huì)出現(xiàn)各種視頻錯(cuò)亂的現(xiàn)象。
六 播放閃屏
閃屏問題,從根源來看,就是播放的過程中,出現(xiàn)了兩種不同的畫面來回切換,從而看起來 閃屏,比如,黑白兩張圖片交替渲染。
1播放器緩沖機(jī)制原因
網(wǎng)絡(luò)不好的時(shí)候,播放器會(huì)頻繁緩沖,曾遇到過一種案例,就是某直播 App 應(yīng)用,在緩沖的時(shí)候,使用了一張廣告圖片,在某種極端弱網(wǎng)情況下,由于頻繁緩沖,導(dǎo)致真實(shí)的播放畫面和廣告圖片來回快速切換,導(dǎo)致閃屏現(xiàn)象。
這個(gè)情況是完全可以從播放器的緩沖策略上避免的,每次緩沖后,不要收到一幀后就立即渲染,而是適當(dāng)?shù)囟嗑彌_一些數(shù)據(jù),再發(fā)送緩沖結(jié)束的消息,從而可以頻繁 ms 級(jí)別的緩沖切換產(chǎn)生的閃屏。
2推流端的原因
推流端產(chǎn)生閃屏的流,往往發(fā)生在有畫面合成的代碼模塊,比如:疊加水印、攝像頭/圖片切換推流、連麥合流等等。
畫面的合成,一定要銘記一點(diǎn),任何情況下,都要避免出現(xiàn),有合成/沒有合成兩種畫面的交替。
————————————————
版權(quán)聲明:本文為CSDN博主「步基」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wangbuji/article/details/121661187
================================
【新聞】
中國e直播帶貨供應(yīng)鏈金融13306003307(V同),
一件代發(fā)共享云倉:主播減去了自己先采購囤貨的問題,可以無壓力的開播賣貨。主播只要選定生廠商的抖音小店產(chǎn)品鏈接或快手小店產(chǎn)品鏈接,在自己直播間上了鏈接就可以賣,賣完由廠家小店訂單結(jié)算,廠家網(wǎng)店直接收款;直播帶貨主播直接分傭金;MCN機(jī)構(gòu)直接分管理費(fèi)。
中國E直播帶貨供應(yīng)鏈機(jī)構(gòu)協(xié)調(diào)廠家按規(guī)則48小時(shí)內(nèi)一件代發(fā)!