为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2019-03-20 22:18:39
程序的部分结构是这样的:录制语音的线程每得到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文件,发现音质已经发生了劣化,具体表现为声音有些发颤。有人能解释下这是为什么么?还是我的实现哪里有问题?
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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

查看完整回答
反对 回复 2019-04-15
?
Qyouu

TA贡献1786条经验 获得超11个赞

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


查看完整回答
反对 回复 2019-04-15
  • 2 回答
  • 0 关注
  • 927 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号