程序的部分结构是这样的:录制语音的线程每得到960字节的语音数据,就发给处理线程的Handler,在handleMessage()中对语音数据进行处理
但是,就在发给handler到从handler取出,语音就发生了劣化。
下面给出代码与代码解释。
在录制语音的线程中,对AudioRecord对象设置OnRecordPositionUpdateListener,在 onPeriodicNotification()取出数据:
recorder.setPositionNotificationPeriod(480);//480frames = 960 bytes recorder.setRecordPositionUpdateListener(new MyUpdateListener());
OnRecordPositionUpdateListener实现是这样的:
class MyUpdateListener implements OnRecordPositionUpdateListener{
byte[][] samples = new byte[10][960];
int i = 0;
int bytesRead;
Bundle data;
Message msg;
@Override
public void onPeriodicNotification(AudioRecord recorder) {
bytesRead = recorder.read(samples[i], 0, 960);
if (bytesRead != 960) {
Log.e(TAG, "bytesRead不是960");
}
try {
fos.write(samples[i], 0, bytesRead);
} catch (IOException e) {
Log.e(TAG,"File Write Error");
e.printStackTrace();
}
data = new Bundle();
data.putByteArray(CommonConfig.lock, samples[i]);
msg = handler.obtainMessage();
msg.setData(data);
msg.sendToTarget();
i = i++ % 10;//错误,这样写和i = i % 10一样
}
}
fos是一个FileOutputStream对象,用来保存录得的语音;CommonConfig.lock是一个static final String。
handler的handleMessage()是这样的:
public void handleMessage(Message msg) {
byte[] buffer = null;
buffer = msg.getData().getByteArray(CommonConfig.lock);
if(buffer.length != 960){
Log.e(TAG,"buffer.length != 960");
}
try {
fos.write(buffer, 0, buffer.length);
} catch (IOException e) {
Log.e(TAG,"File Write Error");
e.printStackTrace();
}
//...其他处理...
}
此处的fos是另一个FileOutputStream对象,与上一个fos一样,保存的文件都为.pcm。
在PC上Cool Edit Pro打开两个PCM文件,发现音质已经发生了劣化,具体表现为声音有些发颤。
有人能解释下这是为什么么?还是我的实现哪里有问题?
白衣染霜花
Qyouu
相关分类