Захват аудио с фиксированным количеством образцов с использованием openAL - PullRequest
0 голосов
/ 06 марта 2020

Для программы распознавания голосовой активности (которая использует VAD webRT C) я хочу записывать звук с микрофона. Для этого я использую openAL. Ниже приведена моя программа для записи звука:

const int SRATE = 16000;
const int SSIZE = 320;

ALbyte buffer[SSIZE];
ALint sample;

void OpenALPOC::recordAudio()
{
    const ALCchar* s=NULL;
    alGetError();

    if (alcIsExtensionPresent(NULL, "ALC_enumeration_EXT") == AL_TRUE)
    {
        s = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
    }

    ALCdevice* device = alcCaptureOpenDevice(s, SRATE, AL_FORMAT_MONO16, SSIZE);
    if (alGetError() != AL_NO_ERROR) {
        cout << "error" << endl;
    }
    alcCaptureStart(device);

    if (true) {
        alcGetIntegerv(device, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(buffer), &sample);
        alcCaptureSamples(device, (ALCvoid*)buffer, sample);

        //Below this webRTC's VAD detection on received buffer ll be performed
    }

    alcCaptureStop(device);
    alcCaptureCloseDevice(device);
}

VAD webRT C требует аудиофрейма моно 16-битной PCM с частотой дискретизации 16 кГц и должна иметь длительность 10, 20 20 миллисекунд Предполагается, что аудиофрейм составляет 10 мс, то есть 320 байт звука при 16000 Гц.

1 sample = 2B = 16 bits  
SampleRate = 16000 sample/sec = 16 samples/ms  
For 10 ms, no of samples    =   160  = 320 bytes

Так что в приведенной выше программе SSIZE Я установил на 320, а buffer того же размера , Но когда я проверяю значение sample после вызова функции alcGetIntegerv, это 1600, 800, 960, это случайное случайное значение при каждом запуске. Я полагаю, что если я указал размер буфера в функции alcCaptureOpenDevice() и alcGetIntegerv(), то после данных alcGetIntegerv().

в данные будет возвращен только тот размер байтов. Итак, как я могу попросить openAL записать аудио для фиксированного количества сэмплов или для длительности 10 миллисекунд?

...