书接上一回。
前文提到如何利用协议编码好音频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 【代码篇 二】
原文地址:http://blog.csdn.net/a_asinceo/article/details/46813535