App增長倍速視頻的坎坷之路

課程視頻愈來愈長,學習時間愈來愈少。面對這些場景,不少視頻播放的App都增長了倍速功能,能夠開啓0.5x、1.5x甚至2.0x等倍速,用於加強播放功能。 iOS系統播放內核的強大,很輕鬆的應付了產品經理提出的這個需求,可是面對市場上數不清的Android系統版本和設備,這讓Android客戶端增長倍速功能,無疑又新添了一道門坎。java

clipboard.png

        爲了增長倍速功能,並保持系統版本兼容,一開始選擇的是集成vlc播放器的方案。vlc 2.x版本後,增長了倍速播放功能,但vlc自己結構比較龐大,集成難度較高,增長了後續維護的難度,在使用一段時間後,開始考慮給Android端更換另一種倍速方案。git

        此次是集成Google ExoPlayer的播放器,ExoPlayer自己在Android 6.0系統及以上,支持系統級別的倍速播放功能,能更好的利用設備硬件功能。ExoPlayer自己出自Google之手,是官方推薦的播放器,對Android系統兼容較好,而且設計結構簡單易懂,容易擴展。github

       可是遺憾在6.0如下就不支持倍速設置。得益於ExoPlayer可擴展性很強,支持對視頻、音頻等渲染器作擴展,經過改變默認音頻渲染器的音頻輸出,能夠加快音頻流的速度,在ExoPlayer中,保持音視頻同步,通常是視頻跟着音頻的速率走,因此咱們調整音頻的速率,就同時也改變了視頻。音頻流的速率調整能夠經過一個三方庫Sonic(https://github.com/waywardgee...)來改變。數組

        當播放器進行構建音頻渲染器的時候,能夠根據Android系統版本選擇不一樣的音頻渲染器。當Android系統是6.0及以上時,咱們使用默認的MediaCodecAudioRenderer,6.0如下時,就使用自定義的音頻渲染器SonicMediaCodecAudioTrackRenderer。
       
clipboard.png緩存

        SonicMediaCodecAudioTrackRenderer的核心,就是拿到音頻流的buffer,使用Sonic對這段buffer數據流進行速率調整處理,而後把調整後的buffer流送給音頻渲染器,這樣就更改了音頻速率。
       
clipboard.png學習

        SonicMediaCodecAudioTrackRenderer自己也繼承至MediaCodecAudioRenderer類,在onOutputFormatChanged方法裏,咱們初始化Sonic和一些緩存buffer數組,並配置速率。spa

        processOutputBuffer方法會在音頻渲染器工做的時候被調用,在這裏使用Sonic來改變原始的音頻流buffer數據,並把轉換後的流buffer傳遞給播放器播放。
       
clipboard.png設計

        在Android 6.0的系統上,咱們只要給默認的MediaCodecAudioRenderer渲染器配置PlaybackParams參數就能夠實現倍速播放了。
       
clipboard.pngorm

        至此,完成了ExoPlayer對倍速功能的支持,併兼容到了多個Android系統版本。在集成到Android項目中,不管從代碼耦合結構,仍是播放器擴展性、易讀性,ExoPlayer無疑比vlc更具優點。
       
歡迎加入學習交流羣569772982,你們一塊兒學習交流。視頻

相關文章
相關標籤/搜索