2012-01-10 2 views
2

Здесь я пытаюсь записывать и воспроизводить голос за раз, он работает нормально в течение нескольких секунд и принудительно закрывает показ ошибки при записи буфера в аудиотрек (m_track.write (буфер, 0, BUF_SIZE);). Проверьте приведенный ниже код и предположите, что я инициализирую объект аудиодорожки правильно.Ошибка записи звукового сигнала и воспроизведения шлейфа, проблема при записи данных в audiotrack

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 help 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

Смежные вопросы