开发语音通信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文件,发现音质已经发生了劣化,具体表现为声音有些发颤。

有人能解释下这是为什么么?还是我的实现哪里有问题?


慕田峪4524236
浏览 928回答 2
2回答

白衣染霜花

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

Qyouu

在手机上正常的录音,在Cool Edit Pro上会发生声音与录音不同的现象.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java