Speex 同时适用于 Ios 与 Android 【代码篇 二】

书接上一回。
前文提到如何利用协议编码好音频pcm数据,使其在解码的时候可以用于ios系统与Android系统。

现在是解码部分,解码部分主要是获取到.spx文件的全部字节,然后根据前文的协议,先获取到.spx的头信息,在头信息中获取到音频的相关参数,然后初始化播放器,再把每一帧解码出来进行播放。

关于协议部分,可以有很多种协议方式,可以沿用speex_header.h定义的方式也可以,我选择了最方便的一种。

以下几个参数特别说明一下,因为直接关系到解码的成败。

比特率:160

比特率为160,证明录音的时候,每一帧源数据为160 个字节。

帧大小为假设的20,证明每一帧160个字节的源数据经过编码压缩后转化为20字节的spx文件。

即:
Speex 同时适用于 Ios 与 Android 【代码篇 二】_第1张图片

因此解码的时候,要先获取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的效果图:
Speex 同时适用于 Ios 与 Android 【代码篇 二】_第2张图片

至此,该demo已经完成,大家可以根据自己的需求再进行处理,特别头信息部分,可以加密处理,或增加长度标示。
希望可以帮到大家理解好speex的用法。

你可能感兴趣的:(android,speex,语音压缩)