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

书接上一回。
前文提到如何利用协议编码好音频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的用法。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值