音視頻問題匯總--播放器seekto功能優(yōu)化
共 1931字,需瀏覽 4分鐘
·
2022-02-09 17:35
最近工作中碰到一個(gè)問題,關(guān)于播放器播放一段視頻的需求,因此查找了一些方案,在此記錄一下。
背景介紹
客戶在設(shè)備上把一段視頻(好了,就是廣告了)當(dāng)作屏保進(jìn)行播放,但是點(diǎn)擊屏幕進(jìn)入系統(tǒng)時(shí)時(shí)要退出屏保播放,進(jìn)入我們的應(yīng)用,然后再次進(jìn)入屏保時(shí)繼續(xù)進(jìn)行視頻播放,并且要從上次退出時(shí)播放的位置順序播放向后循環(huán)播放。
這樣一段需要,本身用Android自帶的MediaPlayer或者M(jìn)ediaCodec進(jìn)行即可播放,但是涉及到再次進(jìn)入屏保應(yīng)用時(shí),還要seekto到上次播放的位置,這里就出現(xiàn)一個(gè)seekto不準(zhǔn)的小問題,客戶無法接受。接觸音視頻比較多的童鞋都知道,當(dāng)要seekto到一個(gè)位置時(shí),當(dāng)前幀可能不是關(guān)鍵幀。所以要從該位置播放時(shí)就需要從該幀之后最近的一個(gè)關(guān)鍵幀開始,這時(shí)播放的位置可能不是客戶想要的。假設(shè)上次播放退出時(shí)是00:00:57的位置,但是離這個(gè)位置最近是在00:00:59的位置,這時(shí)MediaPlayer播放的位置是從00:00:59開始的,客戶說這個(gè)差距太大了,無法接受。那既然是恰飯人,只能想辦法滿足客戶的需求了。那就從Seekto開始一次冒險(xiǎn)之旅吧。
SeekTo介紹
Android播放器自己維護(hù)一個(gè)狀態(tài)機(jī),如下圖:
如果不熟悉的,建議自行補(bǔ)救
官網(wǎng)描述:播放時(shí),可以通過seekto調(diào)整播放的位置,API 26之前只需要一個(gè)參數(shù)int msec,但是API 26之后則需要傳入兩個(gè)參數(shù)(long msec, int mode)。兩個(gè)參數(shù)分別為時(shí)間戳和跳轉(zhuǎn)模式。
Tips:查看MediaPlayer的狀態(tài)圖可以看到seekTo可以在其他狀態(tài)下調(diào)用,例如Prepared,Paused和PlaybackCompleted狀態(tài)。 在這些狀態(tài)下調(diào)用seekTo時(shí),如果流中有視頻并且請求的位置有效,則將顯示一個(gè)視頻幀。
關(guān)鍵幀
學(xué)習(xí)過視頻壓縮概念的都知道:在視頻壓縮概念中,視頻序列的每幀都代表一幅未壓縮的靜止圖像。而在傳輸或者存儲(chǔ)時(shí),會(huì)采取各種算法或者標(biāo)準(zhǔn)進(jìn)行數(shù)據(jù)壓縮,以便能夠最大可能的減少數(shù)據(jù)的冗余容量。而在播放的時(shí)候就是解壓縮或者解碼過程。其中涉及到視頻幀的類型有I幀、P幀、B幀,這些就是最常見的,最基本的概念。
簡單地說,I幀是關(guān)鍵幀,一般屬于幀內(nèi)壓縮、幀內(nèi)編碼,獨(dú)立主義者,不依賴其他視頻幀。而P幀是向前搜索的意思,它需要向前找離它最近的I幀作為參考后進(jìn)行解碼。B是雙向搜索,就是需要向前、向后兩個(gè)方向進(jìn)行參考再進(jìn)行解碼。P幀和B幀都是基于I幀來壓縮數(shù)據(jù)。
參考別的大牛畫的圖:
其他相關(guān)概念大家自行補(bǔ)充,不再累述。
解決方案
現(xiàn)在大家基本上對該問題有一點(diǎn)了解了,剩下就是解決掉他,盤他。
方案一:
最初,我們查找谷歌的官網(wǎng),看是否有足夠的api可以調(diào)用,最小化的代價(jià)解決該問題,就查到了seekto的不同模式切換的描述,選擇SEEK_CLOSEST進(jìn)行嘗試,有效果,但是給客戶看了一下,客戶點(diǎn)了一下頭,但是略有不甘,是否可以更好呢?
方案二:
只能再查資料,重新確定方案了,Google過程中有發(fā)現(xiàn)以下大佬做的優(yōu)化,
我們也進(jìn)行嘗試,但是如果僅僅針對一個(gè)文件,到時(shí)還可以進(jìn)行FFMPEG轉(zhuǎn)換,增加I幀的方式進(jìn)行提升,但是屏保廣告,客戶定期會(huì)更換的呀。總不能每次都進(jìn)行轉(zhuǎn)換吧?
客戶點(diǎn)了半下頭轉(zhuǎn)搖頭了。
方案三:
這時(shí)我們重新分析流程,查看客戶使用場景,分析我們應(yīng)用之間的調(diào)用關(guān)系,然后整理思路。。。。
噔 噔噔噔(windows XP開機(jī)了)
因?yàn)槠帘_M(jìn)入和退出都是由我們自己控制的,無非退出時(shí)將屏保activity放置后臺(tái)了,那我們可以將MediaPlayer盡心pause動(dòng)作,再次進(jìn)入時(shí)進(jìn)行restart操作,就實(shí)現(xiàn)原地暫停、原地播放的效果了?如果后臺(tái)activity被回收、或者異常退出,則用第一種方案seekto到比較近的地方進(jìn)行播放。這樣既可以實(shí)現(xiàn)快速進(jìn)入快速查看,異常退出也可以比較近的位置查看效果。
之后我們緊急做了demo,并演示給客戶看,客戶點(diǎn)了三下頭。貌似接受了。
到此這個(gè)問題就處理完成。
總結(jié)
作為職場恰飯人,客戶就是上帝,這個(gè)句話屬于被迫的,也是我們前進(jìn)的動(dòng)力,當(dāng)我們無法改變時(shí),只能快速排查,尋找最優(yōu)的解決方案。
碰到問題時(shí):
第一,先查官網(wǎng),畢竟類似問題可能官網(wǎng)已經(jīng)有解決方案了。
第二,無法滿足時(shí),及時(shí)分析使用場景,查看是否用其他的方案來繞過該難點(diǎn)問題,不斷切割使之變成新的更小、更容易的問題,這樣處理難度就會(huì)降低。
點(diǎn)贊、評論、私信、關(guān)注、轉(zhuǎn)發(fā),隨時(shí)可以探討,持續(xù)輸出。
