2017-02-21 2 views
0

은 내 가지 audiorecord 인스턴스를 초기화 : 나는 ENCODING_PCM_16BIT을 지정했기 때문에 내가 버퍼에서 반바지를 읽을 필요가지 audiorecord 버퍼 크기

  • : 여기
    // TODO: remember to add RECORD_AUDIO permission 
    int audioSource = MediaRecorder.AudioSource.MIC; 
    
    // TODO: I should consider Nyquist frequency and tell the user if her device can correctly detect frequencies in the range of her instrument 
    int sampleRateInHz = getDeviceSampleRate(context); 
    
    int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
    int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
    
    // TODO: bufferSizeInBytes should be set according to minimum detectable frequency in order to have at least three periods 
    int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 
    
    AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); 
    

    내 질문입니다. 맞습니까?
  • 바이트의 최소 버퍼 크기가 1000 인 경우 500 개의 반바지가 있습니다. 따라서 4096 개의 샘플이 필요하다면 bufferSizeInBytes를 8192로 설정해야합니다. 맞습니까?

감사합니다.

답변

2

ENCODING_PCM_16BIT을 지정했기 때문에 버퍼에서 반바지를 읽어야합니다. 맞습니까?

꼭 그렇지만 반드시 그런 것은 아닙니다. 샘플을 byte[]으로 읽을 수 있지만 byteshort으로 변환 할 때 엔디안을 처리하는 것은 사용자의 몫입니다.

바이트의 최소 버퍼 크기가 1000 인 경우 500 개의 반바지가 있습니다. 따라서 4096 개의 샘플이 필요하다면 bufferSizeInBytes를 8192로 설정해야합니다. 맞습니까?

사실, 아니요.

최소 버퍼 크기는 AudioRecord 인스턴스가 허용 할 최소 크기입니다. 그것은 임계 값과 같습니다. AudioRecord constructor documentation 메시지 :

getMinBufferSize()보다 작은 값을 사용하면 초기화가 실패합니다.

경우에 따라 최소보다 큰 버퍼 크기를 사용할 수 있습니다. AudioRecord.getMinBufferSize() documentation` 말한다이 크기 부하 매끄러운 기록을 보장하지 않으며, 높은 값을 가지 audiorecord 인스턴스가 새 데이터에 대해 폴링 될 때의 예상 빈도에 따라 선택되어야한다

참고있다.

는 여기에 읽기 4096 16 비트 샘플위한 알고리즘이다 :

ByteArrayOutputStream mainBuffer = new ByteArrayOutputStream(); 

int minimumBufferSize = AudioRecord.getMinBufferSize(...); 

byte[] readBuffer = new byte[minimumBufferSize]; 

AudioRecord recorder = new AudioRecord(..., minimumBufferSize); 

recorder.startRecording(); 

while (mainBuffer.size() < 8192) { 

    // read() is a blocking call 
    int bytesRead = recorder.read(readBuffer, 0, minimumBufferSize); 

    mainBuffer.write(readBuffer, 0, bytesRead); 
} 

recorder.stop(); 

recorder.release(); 
+0

감사 회신을 위해. "데이터는 전체 레코딩 버퍼 크기보다 작은 크기의 청크로 오디오 하드웨어에서 읽어야합니다." ([AudioRecord] (https://developer.android.com/reference/android/media/AudioRecord.html)). 따라서 4096 개의 샘플을 분석해야하고 반바지를 읽으려는 경우 8192 개의 'bufferSizeInBytes'를 사용하여 AudioRecord 인스턴스를 초기화해야합니다. 맞습니까? –

+0

게시 한 알 고를 구현해야하는 이유는 무엇입니까? 'AudioRecord # read'를 호출하면 모든 샘플을 읽을 때까지 작업이 중단됩니다. 맞습니까? –

+0

@AdrianoDiGiovanni 8192가'bufferSizeInBytes'에 비해 너무 크다고 생각합니다. 나는'AudioRecord'를'getMinBufferSize()'또는 그것의 몇 배수를 사용하여 만들 것입니다. – nandsito