直播間新手常見技術(shù)問題解答--拖動不準(zhǔn)
現(xiàn)象:播放過程中,拖動進(jìn)度條后,實際播放的位置跟松開拖動時的位置相差很遠(yuǎn)。
由于直播流是實時產(chǎn)生和傳輸?shù)?,是不能拖動的,因此該問題主要出現(xiàn)在點播或者本地文件 的播放。
1 基本概念
首先,我們要了解播放器拖動的基本原理:
視頻是由一系列圖像幀組成的,每一個幀都有對應(yīng)的時間戳。拖動,就是告訴播放一個時間戳,由它直接跳轉(zhuǎn)到指定的這一幀開始播放。
拖動到的時間點 = (進(jìn)度條的 progress / 進(jìn)度條最大值 100 )x 視頻總時長
2 關(guān)鍵幀間隔太大
由于解碼器必須從 I 幀開始解碼,才不會出現(xiàn)花屏現(xiàn)象,因此,播放器通常會尋找離 seekTo 視頻幀最近的一個關(guān)鍵幀,從該關(guān)鍵幀開始解碼播放。
假設(shè)關(guān)鍵幀間隔(GOP)是 3s,那么關(guān)鍵幀的時間點排列如下:
0s, 3s, 6s, 9s
如果拖動到 4s 的位置,那么播放器就跳轉(zhuǎn)到第 3s 的關(guān)鍵幀開始解碼播放,因此,會產(chǎn)生一定的誤差。
關(guān)鍵幀的間隔越大,那么這個誤差也就越大。因此,為了更準(zhǔn)確地支持拖動,建議不要把關(guān)鍵幀間隔設(shè)置得太大。
3 直播丟幀
丟幀的情況多發(fā)生在直播場景,由于主播端的網(wǎng)絡(luò)抖動或者內(nèi)存不足,導(dǎo)致不得不被迫丟掉一些視頻幀,而為了保證客戶端解碼后不出現(xiàn)花屏,丟幀往往伴隨著一整個 GOP 的丟棄。
當(dāng) GOP 丟失后,部分關(guān)鍵幀的間隔時間點就會變得更大了,從而導(dǎo)致拖動不準(zhǔn)。
為了避免這種情況,建議推流端開啟動態(tài)碼率,在網(wǎng)絡(luò)不好的時候,主動降低碼率,快速發(fā)送掉緩沖區(qū)中累積的視頻幀,從而減少丟幀的情況發(fā)生。
4 發(fā)熱
導(dǎo)致機(jī)器功耗高,發(fā)熱嚴(yán)重的根本因素,無外乎就是一點:CPU/GPU 占用率高,所以,我們首先要分析下,哪些因素會導(dǎo)致 CPU/GPU 占用率高。
5 數(shù)據(jù)量太大
直播主要由:視頻采集 -> 視頻處理(剪裁、美顏、濾鏡) -> 編碼 -> 推流 這些環(huán)節(jié)組成。
在這整個流程中,決定數(shù)據(jù)量大小的因素有哪些呢 ?
視頻的尺寸(例如:1280 x 720 的圖像,明顯要比 320 x 240 的圖像處理起來費(fèi)勁)
視頻的幀率(例如:每秒 30 幀,明顯要比每秒 15 幀,處理起來費(fèi)勁)
因此,在不影響業(yè)務(wù)體驗的情況下,適當(dāng)減少視頻的尺寸和幀率,是可以明顯降低后續(xù)環(huán)節(jié) CPU/GPU 的負(fù)荷的,從而顯著降低功耗。
6 大量的格式轉(zhuǎn)換
不同的模塊對數(shù)據(jù)格式的要求,往往有差異,比如 Android 攝像頭出來的數(shù)據(jù)大多是 NV21 的,而編碼器一般要求 I420 格式的數(shù)據(jù);再比如 ffmpeg 解碼的視頻往往是 YUV 格式,而渲染顯示往往需要 RGB 格式,等等。
我們要盡可能減少不同格式之間的數(shù)據(jù)轉(zhuǎn)換,或者盡可能利用 GPU 來處理一些復(fù)雜的格式轉(zhuǎn)換,比如利用 OpenGL 直接渲染 YUV 格式的數(shù)據(jù),而不是用 CPU 做一次 YUV -> RGB 的轉(zhuǎn)換,就是一個不錯的選擇。
7 對圖像進(jìn)行放大操作
前面文章有提到,非常不推薦把一個小尺寸的圖片 -> 放大 -> 大尺寸圖片,這樣很容易出現(xiàn)馬賽克。
其實,這樣的設(shè)計,不僅僅是容易出現(xiàn)馬賽克,而且在圖像放大的過程中,由于涉及到復(fù)雜的插值運(yùn)算,也會非常消耗 CPU。
同理,圖像的縮小或者剪裁,同樣也會消耗一定的 CPU,只不過相比于圖片放大要好點。
因此,最好的辦法,就是小心選擇攝像頭的預(yù)覽分辨率以及推流的尺寸,盡可能讓兩者保持一致,這樣,才能最大化地節(jié)省 CPU 的消耗。
8 軟編/軟解
這個原因或許大家都懂,軟編/軟解靠的是 CPU,非常耗性能,而硬編/硬解是使用專門的硬件編解碼器模塊,會顯著降低 CPU 的負(fù)擔(dān),相對而言,會省電很多。
只不過需要小心各種 Android 機(jī)型兼容性問題,對于某些奇葩設(shè)備,還是加入硬編/硬解黑名單的好。
9 其他方面
當(dāng)然,導(dǎo)致功耗高的因素還有很多,這里就不一一展開說明了,列舉如下:
人臉識別/美顏/濾鏡,對 CPU/GPU 消耗很大
代碼邏輯中過多的 memory copy 操作
后臺線程頻繁喚醒手機(jī)訪問網(wǎng)絡(luò)或者讀寫 SDCard
App 的一些動畫特效
————————————————
版權(quán)聲明:本文為CSDN博主「步基」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接: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小時內(nèi)一件代發(fā)!