一、MediaRecorder
使用MediaRecorder进行声音录制简单方便,不需要理会中间录制过程。结束录制后可以直接得到音频文件进行播放。
由于MediaRecorder较为简单,就不详细介绍,各位看官可自行搜索并试验。
可参考如下博客:
Android MediaRecorder录制音频:http://aina-hk55hk.iteye.com/blog/706793
Andriod MediaRecorder小结:http://www.cnblogs.com/shaobin0604/archive/2011/12/27/2303217.html
Android MediaRecorder框架介绍:http://forest606.blog.163.com/blog/static/13445008920102834914/
二、AudioRecorder
然后在UpdateListener中进行处理。
2.另外开启一线程得到录制数据然后进行处理
第一种方式简单明了,是在主线程中处理,可以很方便的进行其他操作,如更新UI。但实际使用过程中发现,即使没有进行其他操作也会造成程序崩溃,所以不推荐使用。
第二种方式较为麻烦,特别是需要在子线程中更新UI。但是效果很好。
2种方式示例代码如下:
1. UpdateListener
2. 子线程中处理:
使用MediaRecorder进行声音录制简单方便,不需要理会中间录制过程。结束录制后可以直接得到音频文件进行播放。
由于MediaRecorder较为简单,就不详细介绍,各位看官可自行搜索并试验。
可参考如下博客:
Android MediaRecorder录制音频:http://aina-hk55hk.iteye.com/blog/706793
Andriod MediaRecorder小结:http://www.cnblogs.com/shaobin0604/archive/2011/12/27/2303217.html
Android MediaRecorder框架介绍:http://forest606.blog.163.com/blog/static/13445008920102834914/
二、AudioRecorder
在声音录制过程中,有可能我们需要得到采集的声音数据并进行处理,比如降噪,合成等。MediaRecorder明显不能符合要求。而AudioRecorder恰能满足这种要求。过程为一段一段进行录制然后得到数据分别进行处理。
AudioRecorder可以有2种处理方式:
1. 设置AudioRecorder的UpdateListener和NotificationPeriod
- audioRecorder.setRecordPositionUpdateListener(updateListener);
- audioRecorder.setPositionNotificationPeriod(framePeriod);
2.另外开启一线程得到录制数据然后进行处理
第一种方式简单明了,是在主线程中处理,可以很方便的进行其他操作,如更新UI。但实际使用过程中发现,即使没有进行其他操作也会造成程序崩溃,所以不推荐使用。
第二种方式较为麻烦,特别是需要在子线程中更新UI。但是效果很好。
2种方式示例代码如下:
1. UpdateListener
- private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener()
- {
- private int x = 0;
- public void onPeriodicNotification(AudioRecord recorder)
- {
- audioRecorder.read(buffer, 0, buffer.length); // Fill buffer
- try
- {
- //randomAccessWriter.write(buffer); // Write buffer to file
- //payloadSize += buffer.length;
- if (bSamples == 16)
- {
- for (int i=0; i<buffer.length/2; i++)
- { // 16bit sample size
- short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);
- if (curSample > cAmplitude)
- { // Check amplitude
- cAmplitude = curSample;
- }
- }
- }
- else
- { // 8bit sample size
- for (int i=0; i<buffer.length; ++i)
- {
- if (buffer[i] > cAmplitude)
- { // Check amplitude
- cAmplitude = buffer[i];
- }
- }
- }
- }
- catch (Exception e)
- {
- Log.e(ExtAudioRecorder.class.getName(), "Error occured in updateListener, recording is aborted");
- //stop();
- }
- if (x%4 == 0)
- {
- mDrawingView.getEditingLayer().addSquare(x/4, 19 - (int)((cAmplitude/65535.0f)*19));
- mDrawingView.invalidate();
- }
- ++x;
- }
- class AudioRecordThread implements Runnable
- {
- public void run()
- {
- while (isRecording)
- {
- audioRecorder.read(buffer, 0, buffer.length);
- cAmplitude = 0;
- if (bSamples == 16)
- {
- for (int i=0; i<buffer.length/2; i++)
- {
- short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);
- if (curSample > cAmplitude)
- {
- cAmplitude = curSample;
- }
- }
- }
- else
- {
- for (int i=0; i<buffer.length; ++i)
- {
- if (buffer[i] > cAmplitude)
- {
- cAmplitude = buffer[i];
- }
- }
- }
- Message message = Message.obtain();
- message.obj = (Object)(new Integer(19 - (int)((cAmplitude/65535.0f)*19)));
- messageHandler.sendMessage(message);
- }
- }
- }