Как работает буфер AudioRecord/как его использовать

Я играю с библиотекой Android AudioRecord, пытаясь заставить приложение непрерывно считывать данные из audioBuffer. Я думаю, чтобы заставить мое приложение работать, мне нужно лучше понять, как инициализируется буфер с помощью конструктора.

Например, если я инициализирую новый объект AudioRecord:

recorder = new AudioRecord(AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 2205000); //50 seconds worth

В приложении я хочу хранить последние 50 секунд данных в инициализированном здесь буфере, но я хочу периодически вытаскивать последние 10 секунд данных (и все 50, если выполняется условие).

Прежде всего, насколько я понимаю, функция recorder.read(short readData[...) копирует часть внутреннего буфера в массив, который я передаю (?).

Я предполагаю, что внутренний буфер является чем-то вроде кольцевого буфера, так как же я узнаю, какой была последняя выборка? Или это обрабатывается внутри, когда я вызываю recorder.read(short readData[1000],0,1000)? Дает ли это мне последние 1000 образцов, первые 1000 образцов? Насколько я могу судить, второй параметр (смещение) смещается туда, куда он пишет в параметре readData.

Спасибо!


person flyingsilverfin    schedule 06.06.2013    source источник


Ответы (1)


Когда вы вызываете функцию recorder.read(...), параметр sizeInBytes указывает, сколько байтов вы хотите прочитать из внутреннего буфера, начиная с самых старых данных, которые еще не были прочитаны в буфере. Параметр offsetInBytes относится к массиву, который вы передаете, а не к внутреннему буферу.

Если вы хотите прочитать весь буфер (50 мс), вам нужно передать массив (длиной >= 2205000) и sizeInBytes 2205000. Если вам нужны только самые последние 10 секунд, вам все равно нужно прочитать весь буфер, а последние 10 секунд будут последними 441000 возвращаемых байтов. Обратите внимание, что вы не обязательно всегда будете возвращать 2205000 байт; если вы попытаетесь прочитать этот объем данных с интервалом ‹ 50 мс, вы просто получите все данные, доступные при каждом чтении. Но самые последние данные всегда будут в конце возвращаемых данных.

person KevB    schedule 06.06.2013