標籤:android speex 語音壓縮
書接上一回。
前文提到如何利用協議編碼好音頻pcm資料,使其在解碼的時候可以用於ios系統與Android系統。
現在是解碼部分,解碼部分主要是擷取到.spx檔案的全部位元組,然後根據前文的協議,先擷取到.spx的頭資訊,在頭資訊中擷取到音訊相關參數,然後初始化播放器,再把每一幀解碼出來進行播放。
關於協議部分,可以有很多種協議方式,可以沿用speex_header.h定義的方式也可以,我選擇了最方便的一種。
以下幾個參數特別說明一下,因為直接關係到解碼的成敗。
位元速率:160
位元速率為160,證明錄音的時候,每一幀來源資料為160 個位元組。
幀大小為假設的20,證明每一幀160個位元組的來源資料經過編碼壓縮後轉化為20位元組的spx檔案。
即:
因此解碼的時候,要先擷取20位元組的spx資料,解碼出160個位元組的來源資料,然後再進行播放。
byte[] endecode = new byte[65536]; for(int packagecount = 0 ;mDatapro<=(int)spxdatalength;packagecount++){ dis.readFully(endecode,0, frameSize); Log.d(Speex.SPEEX_LOG, "mDatapro="+mDatapro); mDatapro+=frameSize; int decsize; short[] decoded = new short[160]; if((decsize=speexDecoder.decode(endecode, decoded, 160))>0){ Log.d(Speex.SPEEX_LOG, "decsize size="+decsize); Log.d(Speex.SPEEX_LOG, "decoded size="+decoded.length); Log.d(Speex.SPEEX_LOG, "decoded ="+decoded); track.write(decoded, 0, decsize); track.play(); } }
每一次把長度為frameSize的資料讀到endecode中,然後通過speex的decode方法,擷取到來源資料decoded,再把decoded放到播放器中進行播放。
Demo地址:
csdn: http://download.csdn.net/detail/a_asinceo/8879125
git :https://github.com/ParkTJT/Speex
最後上張demo的:
至此,該demo已經完成,大家可以根據自己的需求再進行處理,特別頭資訊部分,可以加密處理,或增加長度標示。
希望可以幫到大家理解好speex的用法。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Speex 同時適用於 Ios 與 Android 【代碼篇 二】