2017-02-21 11 views
0

Я инициализировать мой AudioRecord экземпляр следующим образом: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); 

Вот мои вопросы:

  • Я должен прочитать шорты из буфера, потому что я указал ENCODING_PCM_16BIT. Правильно ли это?
  • Если минимальный размер буфера в байтах составляет 1000, у меня будет 500 шорт. Поэтому, если мне нужно 4096 выборок, я должен установить bufferSizeInBytes на 8192. Правильно ли это?

Спасибо.

ответ

2

Мне нужно прочитать шорты из буфера, потому что я указал ENCODING_PCM_16BIT. Правильно ли это?

Необходимо, но вам необязательно. Вы можете прочитать образцы в byte[], но вам решать обработать континент при преобразовании byte s в short.

Если минимальный размер буфера в байтах составляет 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 выборок, и я знаю, что я буду читать шорты, мне нужно инициализировать экземпляр AudioRecord, используя 'bufferSizeInBytes' из 8192 единиц. Правильно ли это? –

+0

Почему я должен реализовать опубликованное вами сообщение? Если я назову 'AudioRecord # read', операция будет заблокирована до тех пор, пока все образцы не будут прочитаны. Правильно ли это? –

+0

@AdrianoDiGiovanni Я думаю, что 8192 слишком велик для 'bufferSizeInBytes'. Я бы создал 'AudioRecord' с' getMinBufferSize() 'или несколько его кратных – nandsito

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

  • Нет связанных вопросов^_^