“視頻太長太枯燥囊榜,要是可以快進播放就好了!”亥宿、“這個視頻已經(jīng)看過了卸勺,想要快速回顧一下,但是再看1個小時有點久”烫扼、“老師發(fā)音太快曙求,能不能放慢語速,快跟不上節(jié)奏了”
? ? ? ? 課程視頻越來越長映企,學習時間越來越少悟狱。面對這些場景,很多視頻播放的App都增加了倍速功能堰氓,可以開啟0.5x挤渐、1.5x甚至2.0x等倍速,用于增強播放功能双絮。 iOS系統(tǒng)播放內(nèi)核的強大浴麻,很輕松的應付了產(chǎn)品經(jīng)理提出的這個需求,但是面對市場上數(shù)不清的Android系統(tǒng)版本和設備囤攀,這讓Android客戶端增加倍速功能软免,無疑又新添了一道門坎。
? ? ? ? 為了增加倍速功能焚挠,并保持系統(tǒng)版本兼容膏萧,一開始選擇的是集成vlc播放器的方案。vlc 2.x版本后,增加了倍速播放功能榛泛,但vlc本身結(jié)構(gòu)比較龐大蝌蹂,集成難度較高,增加了后續(xù)維護的難度挟鸠,在使用一段時間后叉信,開始考慮給Android端更換另外一種倍速方案亩冬。
? ? ? ? 這次是集成Google ExoPlayer的播放器艘希,ExoPlayer本身在Android 6.0系統(tǒng)及以上,支持系統(tǒng)級別的倍速播放功能硅急,能更好的利用設備硬件功能覆享。ExoPlayer本身出自Google之手,是官方推薦的播放器营袜,對Android系統(tǒng)兼容較好撒顿,并且設計結(jié)構(gòu)簡單易懂,容易擴展荚板。
? ? ? ?但是遺憾在6.0以下就不支持倍速設置凤壁。得益于ExoPlayer可擴展性很強,支持對視頻跪另、音頻等渲染器做擴展拧抖,通過改變默認音頻渲染器的音頻輸出,可以加快音頻流的速度免绿,在ExoPlayer中唧席,保持音視頻同步,一般是視頻跟著音頻的速率走嘲驾,所以我們調(diào)整音頻的速率淌哟,就同時也改變了視頻。音頻流的速率調(diào)整可以通過一個三方庫Sonic(https://github.com/waywardgeek/sonic/blob/master/Sonic.java)來改變辽故。
? ? ? ? 當播放器進行構(gòu)建音頻渲染器的時候徒仓,可以根據(jù)Android系統(tǒng)版本選擇不同的音頻渲染器。當Android系統(tǒng)是6.0及以上時誊垢,我們使用默認的MediaCodecAudioRenderer掉弛,6.0以下時,就使用自定義的音頻渲染器SonicMediaCodecAudioTrackRenderer彤枢。
? ? ? ? SonicMediaCodecAudioTrackRenderer的核心狰晚,就是拿到音頻流的buffer,使用Sonic對這段buffer數(shù)據(jù)流進行速率調(diào)整處理缴啡,然后把調(diào)整后的buffer流送給音頻渲染器壁晒,這樣就更改了音頻速率。
? ? ? ? SonicMediaCodecAudioTrackRenderer本身也繼承至MediaCodecAudioRenderer類业栅,在onOutputFormatChanged方法里秒咐,我們初始化Sonic和一些緩存buffer數(shù)組谬晕,并配置速率。
? ? ? ? processOutputBuffer方法會在音頻渲染器工作的時候被調(diào)用携取,在這里使用Sonic來改變原始的音頻流buffer數(shù)據(jù)攒钳,并把轉(zhuǎn)換后的流buffer傳遞給播放器播放。
? ? ? ? 在Android 6.0的系統(tǒng)上雷滋,我們只要給默認的MediaCodecAudioRenderer渲染器配置PlaybackParams參數(shù)就可以實現(xiàn)倍速播放了不撑。
? ? ? ? 至此,完成了ExoPlayer對倍速功能的支持晤斩,并兼容到了多個Android系統(tǒng)版本焕檬。在集成到Android項目中,無論從代碼耦合結(jié)構(gòu)澳泵,還是播放器擴展性实愚、易讀性,ExoPlayer無疑比vlc更具優(yōu)勢兔辅。