2013-08-02 2 views
0

현재 Android 용 앰프를 제작하려고합니다. 목표는 동시에 기록되는 내용을 기록하고 재생하는 것입니다. 내가 처리 할 스레드를 만들었습니다. 그러나 소리가 고르지 않게 나옵니다. 여기 내가 시도한 것이있다.Android 기록 및 재생

private class RecordAndPlay extends Thread{ 
    int bufferSize; 
    AudioRecord aRecord; 
    short[] buffer; 

    public RecordAndPlay() { 
     bufferSize = AudioRecord.getMinBufferSize(22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
     buffer = new short[bufferSize]; 

    } 

    @Override 
    public void run() {   
      aRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

      try { 
       aRecord.startRecording(); 
      } catch (Exception e) { 

      } 
      int bufferedResult = aRecord.read(buffer,0,bufferSize); 
      final AudioTrack aTrack = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferedResult, AudioTrack.MODE_STREAM); 
      aTrack.setNotificationMarkerPosition(bufferedResult); 
      aTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() { 

       @Override 
       public void onPeriodicNotification(AudioTrack track) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onMarkerReached(AudioTrack track) { 
        Log.d("Marker reached", "..."); 
        aTrack.release();      
        aRecord.release(); 
        run(); 

       } 
      }); 
      aTrack.play(); 
      aTrack.write(buffer, 0, buffer.length);  

    } 

    public void cancel(){ 
     aRecord.stop(); 
     aRecord.release(); 

    } 
} 

답변

0

오디오 트랙이 굶어지고 데이터가 원활하게 전달되지 않기 때문에 재생이 고르지 않습니다. 코드에서 재귀 적으로 실행을 호출하고 마커마다 새 AudioTrack을 만듭니다. 대신 AudioRecord 및 AudioTrack을 한 번만 인스턴스화하고 이벤트를 처리하십시오. 또한 재생을 원활하게하기 위해 재생 전에 약간 녹음을 시작하고 녹음 된 버퍼의 대기열을 유지해야합니다. 그런 다음이 버퍼를 AudioTrack에 전달하는 것을 관리하고 각 마커 이벤트에 항상 제출할 새 버퍼가 있는지 확인하십시오.

+1

조언 해 주셔서 감사합니다. 언급하고 싶은 몇 가지 사항이 있습니다. 첫 번째는 새로운 AudioTrack을 만드는 것입니다. 이를 통해 프로그램 실행 속도가 빨라졌습니다. 두 번째는 내가 코드를 가지고 노는 동안 알아 낸 것입니다. buffer.length를 사용하는 대신 오디오를 재생할 때 buffereredResult를 사용했습니다. 나는 bufferedResult가 버퍼의 절반이라는 사실을 알아 냈습니다. 길이 때문에 나는 그것을 재생할 것을 요구했을 때 절반의 공백을 재생하고있었습니다 (따라서 choppiness). buffer.length에서 bufferedResult로 전환하면 초파리가 크게 줄어들었지만 약간의 지연이 있으며 대기열에 대한 조언을 사용하려고합니다. – piyushg91