分享

Android录音MediaRecorder/AudioRecorder相关总结

 昵称10764837 2012-09-19

这学期,笔者在制作一款Android音乐应用中需要用到录音功能,将MediaRecorder与AudioRecorder总结如下,如有纰误,望包涵并纠正。

一、MediaRecorder
使用MediaRecorder进行声音录制简单方便,不需要理会中间录制过程。结束录制后可以直接得到音频文件进行播放。
由于MediaRecorder较为简单,就不详细介绍,各位看官可自行搜索并试验。
可参考如下博客:
Android MediaRecorder录制音频:http://aina-hk55hk./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

  1. audioRecorder.setRecordPositionUpdateListener(updateListener);    
  2. audioRecorder.setPositionNotificationPeriod(framePeriod);    
然后在UpdateListener中进行处理。
2.另外开启一线程得到录制数据然后进行处理
第一种方式简单明了,是在主线程中处理,可以很方便的进行其他操作,如更新UI。但实际使用过程中发现,即使没有进行其他操作也会造成程序崩溃,所以不推荐使用。
第二种方式较为麻烦,特别是需要在子线程中更新UI。但是效果很好。

2种方式示例代码如下:
1. UpdateListener

  1. private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener()    
  2.     {    
  3.         private int x = 0;  
  4.         public void onPeriodicNotification(AudioRecord recorder)    
  5.         {             
  6.             audioRecorder.read(buffer, 0, buffer.length); // Fill buffer    
  7.             try    
  8.             {    
  9.                 //randomAccessWriter.write(buffer); // Write buffer to file    
  10.                 //payloadSize += buffer.length;    
  11.                 if (bSamples == 16)    
  12.                 {    
  13.                     for (int i=0; i<buffer.length/2; i++)    
  14.                     { // 16bit sample size    
  15.                         short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);    
  16.                         if (curSample > cAmplitude)    
  17.                         { // Check amplitude    
  18.                             cAmplitude = curSample;    
  19.                         }    
  20.                     }    
  21.                 }    
  22.                 else       
  23.                 { // 8bit sample size    
  24.                     for (int i=0; i<buffer.length; ++i)    
  25.                     {    
  26.                         if (buffer[i] > cAmplitude)    
  27.                         { // Check amplitude    
  28.                             cAmplitude = buffer[i];    
  29.                         }    
  30.                     }    
  31.                 }    
  32.             }    
  33.             catch (Exception e)    
  34.             {    
  35.                 Log.e(ExtAudioRecorder.class.getName(), "Error occured in updateListener, recording is aborted");    
  36.                 //stop();    
  37.             }    
  38.             if (x%4 == 0)  
  39.             {  
  40.                 mDrawingView.getEditingLayer().addSquare(x/419 - (int)((cAmplitude/65535.0f)*19));  
  41.                 mDrawingView.invalidate();  
  42.             }  
  43.             ++x;  
  44.         }    
2. 子线程中处理:

  1. class AudioRecordThread implements Runnable   
  2.     {   
  3.         public void run()   
  4.         {   
  5.             while (isRecording)   
  6.             {   
  7.                 audioRecorder.read(buffer, 0, buffer.length);   
  8.                 cAmplitude = 0;  
  9.                 if (bSamples == 16)    
  10.                 {    
  11.                     for (int i=0; i<buffer.length/2; i++)    
  12.                     {   
  13.                         short curSample = ExtAudioRecorder.this.getShort(buffer[2*i], buffer[2*i+1]);    
  14.                         if (curSample > cAmplitude)    
  15.                         {   
  16.                             cAmplitude = curSample;    
  17.                         }    
  18.                     }    
  19.                 }    
  20.                 else       
  21.                 {   
  22.                     for (int i=0; i<buffer.length; ++i)    
  23.                     {    
  24.                         if (buffer[i] > cAmplitude)    
  25.                         {   
  26.                             cAmplitude = buffer[i];    
  27.                         }    
  28.                     }    
  29.                 }    
  30.   
  31.                 Message message = Message.obtain();  
  32.                 message.obj = (Object)(new Integer(19 - (int)((cAmplitude/65535.0f)*19)));  
  33.                 messageHandler.sendMessage(message);  
  34.             }    
  35.         }   
  36.     }   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多