Android中Pcm文件转Amr文件
Android
最经在做一个聊天的模块,聊天的模块很简单:录音-上传-接收-播放
录音
录音部分可以采用MediaRecord和AudioRecord两个类进行录音.但是各有优缺点.
MediaRecord已经封装了很多方法,方便使用.
AudioRecord能获取录音的原生数据,以便对录音二次加工.
在录音过程我采用的是AudioRecord.但是AudioRecord录音数据是PCM格式,数据占用存储空间很大.必须压缩后才能传输.项目中的压缩是项目其他成员写的一个so库进行压缩的,有点不太方便.在网上翻阅了下,其实Android系统内部已经携带有压缩的库文件了.
压缩库
Android自带的有一个Pcm转amr的库:media_jni.so.
但是由于是Android系统内部的库,无法直接使用.根据网上的说明,最终终于弄明白如何使用了.
AmrInputStream
在要使用压缩库的项目中新建包:
com.android.media
在此包中新建AmrInputStream类,代码如下:
publicfinalclassAmrInputStreamextendsInputStream{
static{
System.loadLibrary("media_jni");
}
privatefinalstaticStringTAG="AmrInputStream";
// frame is 20 msec at 8.000 khz
privatefinalstaticintSAMPLES_PER_FRAME=8000*20/1000;
// pcm input stream
privateInputStreammInputStream;
// native handle
privateintmGae;
// result amr stream
privatebyte[]mBuf=newbyte[SAMPLES_PER_FRAME*2];
privateintmBufIn=0;
privateintmBufOut=0;
// helper for bytewise read()
privatebyte[]mOneByte=newbyte[1];
/**
* Create a new AmrInputStream, which converts 16 bit PCM to AMR
* @param inputStream InputStream containing 16 bit PCM.
*/
publicAmrInputStream(InputStreaminputStream){
mInputStream=inputStream;
mGae=GsmAmrEncoderNew();
GsmAmrEncoderInitialize(mGae);
}
@Override
publicintread()throwsI