一、概述
目前,移動互聯網技術飛速發展,影響著人們生活的各個方面。據有關數據統計,2016年中國的移動互聯網用戶數已經超過8億。旅游,教育,購物,娛樂等方面都與之緊密聯系。其中最火的當屬移動直播,各種直播APP鋪天蓋地,而播放器是其中非常重要的部分,播放器的好壞直接影響到直播的用戶體驗。
如何打造一個適合移動直播的播放器呢?首先要保證功能強大,其次兼容性要好,能夠適用于絕大多數的手機,最后要保證輕量級,因為移動設備的內存和磁盤容量都是有限的。
二、播放器框架
對于一個播放器來說,需要包含如下幾個模塊:
1、初始化模塊
該模塊中主要做一些初始化的工作,包括播放器實例的創建,消息機制和
線程的創建,以及相關全局變量的初始化。
2、輸入模塊
輸入模塊包含請求流媒體數據和對流媒體數據進行分解(Demux)兩個部分。
對于移動直播,請求流媒體數據需要支持RTMP、HTTP和HLS協議。Demux模塊需要支持諸如FLV、TS等格式的解析,并將分解后的音視頻裸數據存放在相應的緩沖隊列中,用于后續的解碼。
3、解碼模塊
解碼模塊包含音頻解碼模塊和視頻解碼模塊,音視頻解碼需要分別在兩個
線程中進行,從輸入模塊的緩沖隊列中獲取音視頻裸數據,傳入對應的解碼器進行解碼,并將解碼后的音視頻數據幀存入相應的隊列中用于顯示。其中解碼可以采用軟件解碼和硬件解碼兩種方式:軟件解碼兼容性可容錯性較好,但是耗CPU性能;硬件解碼依賴于系統,Android采用MediaCodec(Android 4.1+),iOS采用VideoToolBox(iOS 8.0+)。兼容性和容錯性較差,好處是不耗CPU。
5、顯示模塊
該模塊主要將解碼后的音視頻數據幀展現出來。音頻和視頻的顯示也是分別
由兩個線程來執行,分別從解碼后的音視頻幀隊列中獲取音視頻幀進行播放,Android端音頻可以用AudioTrack或OpenSL ES進行播放,視頻可以用NativeWindow和Surface進行播放;iOS端音頻可以用AudioQueue或AudioUnit進行播放,視頻可以用OpenGL ES進行播放。
6、事物處理模塊
該模塊主要是對播放器進行一些邏輯控制,比如暫停,播放,seek,截圖等操作,以及一些播放過程中一些消息的反饋。
圖1 播放器框架
三、說明
將上述6個模塊有機的整合在一起,就可以完成一個播放器的開發,但是僅
僅這些還是不夠的。由于移動設備的特殊性,我們可能在播放過程中突然來電,查看QQ、微信等消息,完成這些后希望播放還能夠繼續。這就需要播放器能夠對這些操作有相應的應對措施。有些用戶希望APP切入后臺還能夠繼續播放,有些則不需要,這都需要我們做出相應的處理。并且移動設備的內存和磁盤空間較小,需要我們保證播放器功能完善的前提下包大小盡可能的小,我們可以對各個模塊中所用到的處理引擎進行裁剪,只保留我們所需的功能,這樣我們就可以保證APP的輕量級。
綜上所述,我們不僅要保證底層音視頻引擎高效的運轉,也要保證上層邏輯處理能夠滿足移動設備的特性,這樣我們就可以打造出一款功能完善,兼容性好的播放器。