2012-01-10 15 views
2

ここで私は一度に音声を録音して再生しようとしていますが、数秒間うまく動作しており、 (m_track.write(バッファ、0、BUF_SIZE);)。 下記のコードを確認し、オーディオトラックオブジェクトを正しく初期化するかどうかをお勧めします。オーディオレコードと再生ループバックバッファの問題、オーディオトラックにデータを書き込む際の問題

int SAMPLE_RATE = 8000; 
    int BUF_SIZE = 1024; 
    byte[] buffer = new byte[BUF_SIZE]; 

function() 
{ 
try 
{ 
      buffersize = AudioRecord 
        .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, 
          AudioFormat.ENCODING_PCM_16BIT); 

     } catch (Throwable t) { 
      Log.e("Audio", "Buffer size failed"); 
     } 

     if (buffersize <= BUF_SIZE) { 
      buffersize = BUF_SIZE; 
     } 
     try { 

      m_record = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, buffersize * 2); 

      m_track = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
        SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, buffersize * 2, 
        AudioTrack.MODE_STREAM); 

      m_track.setPlaybackRate(SAMPLE_RATE); 
     } catch (Throwable t) { 
      Log.e("Audio", "Audio Failed"); 
     } 

     m_record.startRecording(); 
     m_track.play(); 
     try { 
      m_thread = new Runnable() { 
       public void run() { 
        while (m_isRun) { 

         m_record.read(buffer, 0, BUF_SIZE); 
         m_track.write(buffer, 0, BUF_SIZE); 
        } 
       } 
      }; 

      m_thread.run(); 
     } catch (Exception e) { 
      Log.e("ERROR", "exception: " + e.getLocalizedMessage()); 
     } 

     Log.i("D2Record", "loopback exit"); 
    } 
+0

この問題をどのように解決しましたか?私も同じ問題を抱えています... plzヘルプhttp://stackoverflow.com/questions/9413998/live-audio-recording-and-playing-in-android-and-thread-callback-handling – aProgrammer

答えて

2

私はこのトピックに精通していませんが、バッファサイズに問題があると思います。私はコードのほとんどを離れて、主にバッファ処理に集中しています。

int SAMPLE_RATE = 8000; 
int BUF_SIZE = 1024; 

int buffersize = AudioRecord 
       .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, 
         AudioFormat.ENCODING_PCM_16BIT); 
bufferSize = Math.Max(bufferSize, AudioTrack 
       .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, 
         AudioFormat.ENCODING_PCM_16BIT); 
bufferSize = Math.max(bufferSize, BUF_SIZE); 
byte[] buffer = new byte[bufferSize]; 

m_record = new AudioRecord(MediaRecorder.AudioSource.MIC, 
       SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, 
       AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
m_track = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
       SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, 
       AudioFormat.ENCODING_PCM_16BIT, bufferSize, 
       AudioTrack.MODE_STREAM); 

m_track.setPlaybackRate(SAMPLE_RATE); 
m_record.startRecording(); 
m_track.play(); 
while (m_isRun) { 
    // You should check 'read' for errors after read. 
    int read = m_record.read(buffer, 0, bufferSize); 
    // You should check 'wrote' for errors after write. 
    int wrote = m_track.write(buffer, 0, read); 
} 
+0

まだ、その与える問題、とにかく試してくれてありがとう – candy

関連する問題