手機(jī)游戲直播 : 悟空TV客戶端設(shè)計與技術(shù)難點
在手機(jī)游戲直播中,悟空TV采用以下方案達(dá)到多源錄制枣抱、多端播放的效果熔吗。主要分為三大過程:錄制源的采集,以RTMP傳輸協(xié)議動態(tài)上傳到CDN佳晶,各播放端實時拉流桅狠。
圖1 手機(jī)游戲直播方案
接下來將一一討論悟空 TV 移動推流端和播放端遇到的難點及對應(yīng)的優(yōu)化方案。
移動端抓屏方案
Android
Android 5.0 之后系統(tǒng)版本轿秧,開放了屏幕采集接口中跌,這里不再贅述。5.0系統(tǒng)之前菇篡,則需要使用其他方式抓屏漩符,悟空TV采取了先獲取root權(quán)限,再使用Runtime執(zhí)行命令的方式來實現(xiàn)屏幕抓取驱还,流程如圖2所示嗜暴。
圖2 Android抓屏流程
iOS
如何在蘋果設(shè)備上抓屏一直是個難題凸克,悟空TV利用蘋果AirPlay鏡像(AirPlay Mirroring)功能,將應(yīng)用本身變成支持Airplay投屏的虛擬服務(wù)器闷沥,從而將手機(jī)屏幕通過AirPlay投到應(yīng)用內(nèi)萎战,實現(xiàn)抓屏的功能,流程如圖3所示舆逃。
圖3 iOS抓屏流程
直播卡頓優(yōu)化
直播講究播放的流暢性蚂维,如果頻繁卡頓會嚴(yán)重影響用戶的觀看體驗。在直播中路狮,卡頓的大多是由網(wǎng)絡(luò)環(huán)境不佳引起的鸟雏。而悟空TV移動端的推流/播放處于移動網(wǎng)絡(luò)環(huán)境,相較于PC平臺更加復(fù)雜览祖,主要難點包括以下方面:
移動網(wǎng)絡(luò)上傳、下載帶寬不足
移動3G網(wǎng)絡(luò)在信號不佳時炊琉,最高只能達(dá)到100Kb/s的上傳展蒂、下載速度,在直播時苔咪,游戲本身也會占據(jù)非常高的帶寬锰悼;然而,游戲直播對畫面質(zhì)量和連貫性的要求团赏,要比其他類型的直播更高箕般。綜合以上因素,移動網(wǎng)絡(luò)帶寬不足的問題尤為突出舔清。主要解決思路是壓縮傳輸?shù)臄?shù)據(jù)量丝里。通過優(yōu)化推流端的編碼參數(shù),包括分辨率体谒、碼率杯聚、幀率、i幀間隔等抒痒,可以非常有效地縮小傳輸消耗的帶寬幌绍。另外,合理選擇編碼協(xié)議(常見有H.261/H.263/H.264/H.265)故响,也能極大提高數(shù)據(jù)壓縮能力傀广。悟空TV設(shè)定了超清、高清彩届、普清伪冰、標(biāo)清四個檔位的直播質(zhì)量,以適應(yīng)不同情況的移動網(wǎng)絡(luò)惨缆。
除此之外糜值,悟空TV還采用了兩種方案來實時監(jiān)控直播效果:一種為推流端網(wǎng)絡(luò)實時監(jiān)測系統(tǒng)丰捷,在推流的過程中,實時監(jiān)測推流效果寂汇,當(dāng)監(jiān)測到推流效果不佳時病往,直接在推流端給出降低編碼檔位的提示,引導(dǎo)用戶提高當(dāng)前推流效果骄瓣,減少視頻卡頓停巷;另外一種為后臺人工干預(yù)手段,當(dāng)工作人員在巡查中發(fā)現(xiàn)直播嚴(yán)重卡頓時榕栏,會通過后臺發(fā)送調(diào)整推流檔位指令畔勤,推流端自動降低該直播的編碼檔位。
帶寬足夠的情況下扒磁,經(jīng)常會遇到網(wǎng)絡(luò)波動極大的情況
移動端直播過程中庆揪,WIFI信號的強(qiáng)弱變化非常容易使網(wǎng)速時快時慢。3G/4G環(huán)境更加容易發(fā)生此問題妨托。那么如何在網(wǎng)絡(luò)經(jīng)常波動的情況下缸榛,保持直播流暢呢?
悟空TV主要采取了兩種手段降低網(wǎng)絡(luò)波動的影響兰伤。第一内颗,在可接受延遲的范圍內(nèi),合理設(shè)定推流端和播放端的緩沖區(qū)大卸厍弧均澳;第二,推流端會在網(wǎng)絡(luò)波動大的時候符衔,數(shù)據(jù)上傳時間過長找前,導(dǎo)致緩沖區(qū)剩余空間不足。此時如果一味增加緩沖區(qū)大小判族,會導(dǎo)致播放端與推流端延遲過大纸厉,這就需要推流端丟棄部分?jǐn)?shù)據(jù)幀,加快直播進(jìn)度五嫂。但是颗品,在某些丟幀情況下,會導(dǎo)致播放端花屏沃缘,需要在設(shè)定丟幀策略時注意躯枢。
CDN鏈路優(yōu)化
移動網(wǎng)絡(luò)經(jīng)常會遇見用戶的DNS與其實際所處區(qū)域偏差較大的情況,嚴(yán)重影響了CDN調(diào)度效率槐臀。
悟空TV主要采用三個手段解決此問題锄蹂,一是優(yōu)化調(diào)度方式,將DNS調(diào)度改為IP調(diào)度水慨,結(jié)合各CDN廠商自有調(diào)度系統(tǒng)(如網(wǎng)速的NGB調(diào)度系統(tǒng))得糜,規(guī)避虛假IP地址敬扛,實時判斷節(jié)點機(jī)器的性能、負(fù)載情況朝抖、網(wǎng)絡(luò)情況等啥箭,更合理、更精確地分配了推流端和播放端的節(jié)點資源治宣,提高流暢性急侥;第二個方法是后臺切換CDN,工作人員在巡查中侮邀,如果發(fā)現(xiàn)當(dāng)前推流質(zhì)量不佳是鏈路質(zhì)量過低導(dǎo)致的坏怪,會通過后臺發(fā)送切換CDN節(jié)點指令,推流端自動切換CDN節(jié)點绊茧。
播放端首屏?xí)r長的優(yōu)化
首屏?xí)r間铝宵,指的是從進(jìn)入直播間開始到第一次看到直播畫面的時間。首屏?xí)r間過長極易導(dǎo)致用戶失去對直播的耐心华畏,降低用戶的留存捉超。但游戲直播對畫面質(zhì)量和連貫性的要求高,對應(yīng)推流端編碼后的數(shù)據(jù)量和其他類型直播相比大的多唯绍,如何降低首屏?xí)r間是一個不小的難題。
在播放端的首屏過程中枝誊,主要有以下三個操作需要進(jìn)行:加載直播間UI(包括播放器本身)况芒、下載直播數(shù)據(jù)流(未解碼)和解碼數(shù)據(jù)播放。其中數(shù)據(jù)解碼播放又可細(xì)分為以下幾個步驟:
檢測傳輸協(xié)議類型(RTMP叶撒、RTSP绝骚、HTTP等)并與服務(wù)器建立連接接收數(shù)據(jù);
解析數(shù)據(jù)類型獲取視頻流信息祠够;
視頻流解復(fù)用得到音視頻編碼數(shù)據(jù)(H.264/H.265压汪、AAC等);
音視頻數(shù)據(jù)解碼古瓤,音頻數(shù)據(jù)同步至外設(shè)止剖,視頻數(shù)據(jù)渲染到屏幕,至此落君,視頻開始播放穿香,首屏?xí)r間結(jié)束。
由此绎速,我們總結(jié)出以下提高首屏?xí)r間的方案:首先皮获,加載UI可以以單例的方式進(jìn)行,能夠一定程度地提升首屏展示速度纹冤;其次洒宝,可以預(yù)設(shè)解碼類型购公,減少數(shù)據(jù)類型檢測時間;再次雁歌,設(shè)定合理的下載緩沖區(qū)大小宏浩,盡可能減少下載的數(shù)據(jù)量,當(dāng)檢測到I幀數(shù)據(jù)将宪,立即開始解碼單幀畫面進(jìn)行播放绘闷,提高首屏展示時間。
音視頻同步
觀看直播時较坛,最令人頭痛的就是音視頻不同步印蔗,解決不同步問題的方法有很多種,從技術(shù)上來說丑勤,其中時間戳是最成熟最完美也是最復(fù)雜的解決辦法华嘹,可以解決任何多媒體領(lǐng)域的音視頻同步問題。主要原理是選擇一個參考時間法竞,在生成數(shù)據(jù)流時依據(jù)參考時間給每個數(shù)據(jù)塊都打上時間戳耙厚;播放時,讀取數(shù)據(jù)塊上的時間戳岔霸,同時參考本地時間來安排播放薛躬。但如果源數(shù)據(jù)幀上打的時間戳本身就有問題,那么播放時再怎么調(diào)整也于事無補(bǔ)呆细,所以解決音視頻不同步問題型宝,必須先從源上來解決。一般來說絮爷,解決同步問題我們有三種選擇:同步音頻到視頻趴酣,同步視頻到音頻,或者都同步到外部時鐘(例如系統(tǒng)時鐘)坑夯。悟空TV使用同步視頻到音頻方案來保障音視頻的同步岖寞,實現(xiàn)流程如圖4所示。
圖4 音視頻同步實現(xiàn)流程
推流端啟用獨立的音頻和視頻線程柜蜈,進(jìn)行音視頻采集以及編碼仗谆,音頻采集編碼后只管往外發(fā)送數(shù)據(jù)即可。而視頻線程采集編碼完之后淑履,需要同步時間戳到音頻的時間戳胸私,并做時間戳的有效性判定,只有有效的視頻數(shù)據(jù)才會發(fā)送到服務(wù)器鳖谈。
軟硬編解碼的選擇
軟編解碼:使用CPU進(jìn)行編解碼岁疼,大多使用FFmpeg來編碼和解壓音視頻數(shù)據(jù);
硬編解碼:主要使用非CPU進(jìn)行編解碼,如GPU等捷绒。在使用中瑰排,大多直接調(diào)用系統(tǒng)API進(jìn)行音視頻編解碼處理行瑞。
綜合以上情況伞广,經(jīng)過悟空TV和大量用戶的測試及總結(jié)邢享,在推流方面筑辨,iOS系統(tǒng)和硬件設(shè)備統(tǒng)一性高,使用全硬編方案效果更好尘执;Android因機(jī)型繁雜礼搁,支持程度不一瀑构,推薦4.3以上使用硬編葫掉。在播放解碼方面些举,iOS硬解和軟解支持性都較高,軟解功耗更高俭厚,但是在部分細(xì)節(jié)方面表現(xiàn)較優(yōu)户魏,可控性強(qiáng),具體視項目情況選擇挪挤;Android推薦4.1版本以上使用硬解叼丑,以下版本使用軟解。
繁雜的機(jī)型適配
做Android應(yīng)用的開發(fā)人員都知道扛门,市面上冗雜的機(jī)型再加上各式各樣的屏幕尺寸鸠信,已經(jīng)讓適配非常繁瑣,而做直播軟件论寨,適配問題遠(yuǎn)遠(yuǎn)不止這些星立,下面列舉幾個悟空TV遇到的適配問題:
部分Android 5.0以上機(jī)型由于ROM被修改無法實現(xiàn)抓屏。
部分機(jī)型錄制的視頻出現(xiàn)花屏問題政基。
部分機(jī)型錄制攝像頭出現(xiàn)旋轉(zhuǎn)、拉升等問題闹啦。
部分廠商機(jī)型因權(quán)限問題無法打開浮窗沮明。
不斷出產(chǎn)新的機(jī)型,不斷出現(xiàn)新的適配問題窍奋。
針對各種繁雜的適配問題荐健,如果在客戶端代碼中寫死了配置或判斷邏輯將非常不利于版本的維護(hù)和迭代。悟空TV使用了“云控”的手段來處理適配問題琳袄,在與服務(wù)器進(jìn)行交互時江场,把客戶端機(jī)型、系統(tǒng)版本號窖逗、分辨率址否、應(yīng)用版本號等信息上傳給服務(wù)器,然后在云端(即服務(wù)器端)來做整體配置碎紊,從而控制此設(shè)備是否允許直播佑附、是否需要彈出浮窗設(shè)置以及直播應(yīng)該使用的碼率樊诺、FPS等。
總結(jié)
做直播音同,尤其是要在移動端提供穩(wěn)定词爬、流暢的直播服務(wù),是在日常工作中不斷改進(jìn)不斷調(diào)優(yōu)权均、不斷調(diào)整算法和動態(tài)運營的結(jié)果顿膨,并不是實現(xiàn)幾個技術(shù)點或攻克幾個Bug就能坐享一套穩(wěn)定流暢的直播服務(wù)的。直播之路還很長叽赊,仍需繼續(xù)努力恋沃。悟空TV將秉承為大家提供一個穩(wěn)定流暢好玩的手游直播平臺而繼續(xù)努力。
作者簡介
本文為《程序員》原創(chuàng)文章蛇尚,未經(jīng)允許不得轉(zhuǎn)載芽唇,更多精彩文章請訂閱2016年《程序員》
劉燕青,Android高級開發(fā)工程師取劫,多年Android研發(fā)經(jīng)驗匆笤,主要負(fù)責(zé)悟空TV App的架構(gòu)以及研發(fā)工作,包括Android端屏幕錄制谱邪、攝像頭錄制炮捧、音頻采集、編碼推流等工作惦银。目前專注于音視頻相關(guān)的研究和應(yīng)用咆课。
李越,iOS開發(fā)工程師扯俱,主要負(fù)責(zé)悟空TV iOS客戶端和錄制端的研發(fā)工作书蚪,包括iOS端屏幕錄制、攝像頭錄制迅栅、音頻采集殊校、編碼推流、拉流播放等工作读存。目前專注于音視頻相關(guān)的研究和應(yīng)用为流。