2011-09-16 73 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以上に上げて録音すると、よりうまく動作します。

関連する問題