之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接
http://www.cnblogs.com/dongweiq/p/4515186.html
虽然自己实现了相关的压缩算法,但是发现还是与gauss的压缩比例差了一些,一部分是参数设置的问题,另外一部分是没有使用ogg的问题。
本来想研究一下gauss的ogg算法,然后将他录制的音频转为wav格式,再继续进行后面的频谱绘制之类的。
在后续的研究gauss的解码过程,他是先解了ogg的格式,然后分段,然后去掉speex的头,然后把一段段的speex数据再解码成pcm的原数据,最后使用audiotrack一段段播放出来了。audiotrack播放的时候是阻塞的,所以播了多久就解了多久。
既然他得到了一段段pcm的原数据,那我就可以去将这一段段的原数据拼起来,最后得到解码完成的整个的pcm数据,最后加上wav的头不就可以直接转换成wav格式的音频了么???
前天的时候想到这里,立马就去改了。
SpeexDecoder是gauss的demo里主要的解码类,我们复制一份,改名为SpeexFileDecoder
去掉里面跟播放相关的audiotrack变量,因为我们要得到的是解码数据,跟播放无关。
修改后代码如下
1 package com.sixin.speex;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.RandomAccessFile;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import android.media.AudioFormat;
11 import android.media.AudioManager;
12 import android.media.AudioTrack;
13 import android.os.RecoverySystem.ProgressListener;
14 import android.util.Log;
15
16 /**
17 * 采用Jspeex方案,首先解包,从ogg里面接出来,然后使用speex decode将speex转为wav数据并进行播放
18 *
19 * @author Honghe
20 */
21 public class SpeexFileDecoder {
22
23 protected Speex speexDecoder;
24 private String errmsg = null;
25 private List<ProgressListener> l