2012-06-22 3 views
4

처리를 위해 원시 오디오를 녹음하기 위해 AudioRecord를 사용하고 있습니다. 오디오는 전적으로 잡음없이 기록되지만 원시 PCM 데이터가 재생되면 많은 속도가 빨라진 것처럼 재생됩니다 (최대 약 2 배). Audacity에서 PCM 데이터를보고 재생하고 있습니다. 나는 실제 전화 (삼성 갤럭시 S5670)를 사용하여 테스트하고있다. 녹음은 44100 Hz, 16 비트에서 수행됩니다. 무슨 일이 일어날 지 모르는 어떤 생각? 해결Android에서 AudioRecord로 녹음하면 오디오 속도가 빨라 집니까?

public class TestApp extends Activity 
{ 
File file; 
OutputStream os; 
BufferedOutputStream bos;  
AudioRecord recorder; 
int iAudioBufferSize; 
boolean bRecording; 
int iBytesRead; 

Thread recordThread = new Thread(){ 
    @Override 
    public void run() 
    { 
     byte[] buffer = new byte[iAudioBufferSize]; 
     int iBufferReadResult; 
     iBytesRead = 0; 
     while(!interrupted()) 
     { 
      iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize); 
      // Android is reading less number of bytes than requested. 
      if(iAudioBufferSize > iBufferReadResult) 
      { 
       iBufferReadResult = iBufferReadResult + 
         recorder.read(buffer, iBufferReadResult - 1, iAudioBufferSize - iBufferReadResult); 
      }    
      iBytesRead = iBytesRead + iBufferReadResult; 
      for (int i = 0; i < iBufferReadResult; i++) 
      { 
       try 
       { 
        bos.write(buffer[i]); 
       } catch (IOException e) 
       {            
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    // File Creation and UI init stuff etc. 

    bRecording = false; 
    bPlaying = false; 

    int iSampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM); 
    iAudioBufferSize = AudioRecord.getMinBufferSize(iSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize); 

    bt_Record.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if (!bRecording) 
      { 
       try 
       {      
        recorder.startRecording(); 
        bRecording = true; 
        recordThread.start();      
       } 
       catch(Exception e) 
       { 
        tv_Error.setText(e.getLocalizedMessage()); 
       } 
      } 
      else 
      { 
       recorder.stop(); 
       bRecording = false; 
       recordThread.interrupt(); 
       try 
       { 
        bos.close(); 
       } 
       catch(IOException e) 
       { 

       } 
       tv_Hello.setText("Recorded Sucessfully. Total " + iBytesRead + " bytes."); 
      } 
     } 

    }); 
} 
} 

: 다음

녹화 코드 I 1 ~ 2 일 동안 고민 한 후이를 기록했다. 그러나 아이러니하게도, 게시 한 직후 솔루션을 발견했습니다. 버퍼링 된 출력 스트림 쓰기는 for 루프에서 너무 많은 시간이 걸리므로 스트림이 샘플을 건너 뜁니다. for 루프를 제거하여 쓰기를 차단하도록 변경했습니다. 완벽하게 작동합니다.

+1

해결책을 찾으면 간단하게 자신의 질문에 답하고 답을 표시하십시오. – Flow

답변

5

오디오 건너 뛰기는 버퍼에 쓰기가 지연되어 발생했습니다. 낮은 샘플, 내가 추측을

 bos.write(buffer, 0, iBufferReadResult); 

내가 일을 책에서 코드를 사용했다 : 단일 쓰기로

 for (int i = 0; i < iBufferReadResult; i++) 
     { 
      try 
      { 
       bos.write(buffer[i]); 
      } catch (IOException e) 
      {            
       e.printStackTrace(); 
      } 
     } 

과 같이 : 솔루션은 루프에 대해이 작업을 대체하는 것입니다 속도 및 버퍼 업데이트.

관련 문제