2011-09-16 130 views
1

我想录制使用AudioRecord类的语音,并使用AudioTrack类将 的读取字节写入扬声器。我能够听到来自扬声器的声音 ,但是声音非常低,并且伴随录制的声音产生了很多噪音。记录的声音非常非常低,大量的噪音记录在Android上

任何解决方案来解决这个问题,以减少噪音和大声的 真实的声音。

我使用下面的代码是:

package com.my.mic.record; 

    import android.media.AudioFormat; 
    import android.media.AudioManager; 
    import android.media.AudioRecord; 
    import android.media.AudioTrack; 
    import android.media.MediaRecorder; 
    import android.util.Log; 

    public class Record extends Thread 
    { 

      int numCrossing,p,numSamples,af; 

      static final int bufferSize = 200000; 
      short[] buffer = new short[bufferSize]; 
      short[] readBuffer = new short[bufferSize]; 
      boolean isRecording; 
      AudioManager am; 

      public AudioRecord arec; 
      public AudioTrack atrack; 

      private int sampleRate = 8000; 


      public void run() { 


        isRecording = true; 

    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

        int buffersize = 
    AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO, 
    AudioFormat.ENCODING_PCM_16BIT); 

        arec = new 
    AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT, 
            buffersize); 

        //buffersize = arec.getMinBufferSize(arec.getSampleRate(), 
    arec.getChannelConfiguration(), arec.getAudioFormat()); 

        atrack = new 
    AudioTrack(AudioManager.STREAM_MUSIC,arec.getSampleRate(),arec.getChannelConfiguration(),arec.getAudioFormat(), 
            buffersize,AudioTrack.MODE_STREAM); 

        am.setRouting(AudioManager.MODE_NORMAL,AudioManager.ROUTE_EARPIECE, 
    AudioManager.ROUTE_ALL); 
        //am.setMode(AudioManager.MODE_NORMAL); 


        Log.d("SPEAKERPHONE", "Is speakerphone on? : " + 
    am.isSpeakerphoneOn()); 

        atrack.setPlaybackRate(sampleRate); 


        byte[] buffer = new byte[buffersize]; 
        arec.startRecording(); 
        atrack.play(); 
        //atrack.setStereoVolume(atrack.getMaxVolume(), 
    atrack.getMaxVolume()); 

        final float frequency = sampleRate; 
      float increment = (float)((2*Math.PI) * frequency/44100); // 
    angular increment for each sample 
      float angle = 0; 
      //AndroidAudioDevice device = new AndroidAudioDevice(); 

        while(isRecording) { 

          try { 

            arec.read(buffer, 0, buffersize); 
            atrack.write(buffer, 0, buffer.length); 

          } catch (Exception e) { 
            Log.d("Record", ""+e); 
          } 
        } 

        arec.stop(); 
        atrack.stop(); 
        //device.releaseTrack(); 
        isRecording = false; 
      } 


      public boolean isRecording() { 
        return isRecording; 
      } 

      public void setRecording(boolean isRecording) { 
        this.isRecording = isRecording; 
      } 

      public AudioManager getAm() { 
        return am; 
      } 

      public void setAm(AudioManager am) { 
        this.am = am; 
      } 

     public void stopRecording(){ 
       arec.stop(); 
     arec.release(); 
     atrack.stop(); 
     atrack.release(); 
     arec=null; 
     atrack=null; 
     setRecording(false); 
     this.stop(); 
     } 
} 
+0

嗨我面临同样的问题,请让我知道你有任何解决办法来处理这种情况? – aftab

回答

0

转到this工作录音例如,如果你在模拟器进行测试,然后采样率会是8000的默认。对于设备将采样率提高到44100或更高,并记录下来,它会更好地工作。