开发语音通信APP时遇到的音质劣化问题

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

阅读 3.9k
2 个回答

知道哪边出错了。不应该是i = i++ % 10,这样写和i = i % 10一样。i增一的操作是在求余和赋值之间进行的。
改成i = ++i % 10声音就正常了。

在手机上正常的录音,在Cool Edit Pro上会发生声音与录音不同的现象.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题