
解協議的作用,就是將流媒體協議的數據,解析為標準的相應的封裝格式數據。音視頻在網絡上傳播的時候,常常采用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,采用RTMP協議傳輸的數據,經過解協議操作后,輸出FLV格式的數據。
1. 解封裝
解封裝的作用,就是將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
2. 解碼
解碼的作用,就是將視頻/音頻壓縮編碼數據,解碼成為非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3,AC-3等等,視頻的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最復雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻數據輸出成為非壓縮的音頻抽樣數據,例如PCM數據。
3. 音頻同步
視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,并將視頻音頻數據送至系統的顯卡和聲卡播放出來。
4. 硬解碼和軟解碼
硬解
字面上理解就是用硬件解碼。通過顯卡的視頻加速功能對高清視頻進行解碼。可以理解為有一個專門的電路板來進行視頻的解碼工作,是依靠GPU。 調用GPU的專門模塊編碼來解碼,減少CPU運算。顯卡核心GPU擁有獨特的計算方法,解碼效率非常高,這樣不但能夠減輕CPU的負擔,還有著低功耗,發熱少等特點。
但是,由于硬解碼起步比較晚,軟件和驅動對他的支持度很低,基本上硬解碼內置什么樣的模塊,就解碼什么樣的視頻,面對網上各色各樣的視頻編碼樣式,兼容性不好。此外,硬解碼的濾鏡、字幕、畫質方面都做的不夠理想。
對于android設備,目前用得比較多的芯片就是高通、海思和聯發科,這些芯片大都集成了很多的功能,CPU、GUP、DSP、ISP包括視頻解碼、音頻解碼等等。 在Android中使用硬件解碼直接使用MediaCodec就可以了,雖然MediaPlayer也是硬件解碼,但是被封裝得太死了,支持的協議很少。而MediaCodec就很好拓展,我們可以根據流媒體的協議和設備硬件本身來自定義硬件解碼,代表播放器就是Google的ExoPlayer。
軟解
字面上理解就是用軟件解碼。但是實際上還是要硬件支撐。這個硬件就是CPU。 在軟解碼過程中,需要對大量的視頻信息進行運算,所以對CPU性能的要求非常高。尤其是對高清大碼率的視頻來說,巨大的運算量就會造成轉換效率低,發熱量高等問題。 我們最常見的視頻軟解碼開源庫就是FFmpeg。目前基于FFmpeg的開源播放器有B站的ijkplayer 不過,軟解碼不需要過多的硬件支持,兼容性非常高,即使出現新的視頻編碼格式,只要安裝好相應的解碼器文件,就可以順利播放。而且軟解碼擁有豐富的濾鏡,字幕,畫面處理優化等效果,只有你CPU夠強悍,就能夠實現更加出色的畫面效果。
5. 硬解和軟解總結
在Android設備硬件支持的情況下優先使用Android設備的硬件解碼,減少CPU的占用,更加省電。 在Android設備硬解不支持的情況下選擇使用軟解碼,不管怎么樣,視頻至少能夠播放,具有更好的適應性,但是增加了CPU的占用,更加費電,軟硬結合才是最好。