程序的部分结构是这样的:录制语音的线程每得到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文件,发现音质已经发生了劣化,具体表现为声音有些发颤。有人能解释下这是为什么么?还是我的实现哪里有问题?
添加回答
举报
0/150
提交
取消