Как записать необработанные аудиоданные в файл, захваченный с помощью Alsa Driver C++

Я пытаюсь записать необработанные аудиоданные в определенный файл, используя драйвер Alsa.

Под кодом:

ofstream binaryFile ("file.raw", ios::out | ios::binary);

if(inputData==NULL)
{
    inputData = (uint8_t *)malloc(sizeOfDataInBytes);
}

while (audio_en)
{
    snd_pcm_sframes_t numAudioFramesRead = snd_pcm_readi(ndi_AudioSupport.m_captureHandle,inputData, 
    ndi_AudioSupport.m_numAudioFramesPerVideoFrame);
    
    if(numAudioFramesRead > 0)
    {
        binaryFile.write ((char*)inputData, sizeof (inputData));
    }
}

binaryFile.close();

person Zaid Aslam    schedule 23.07.2020    source источник


Ответы (1)


Один из подходов к написанию множества различных аудиоформатов, включая raw, заключается в использовании аудиобиблиотеки sox (libsox). Классы C++ ALSA и классы libsox встроены в gtkIOStream.

Пример записи в необработанный аудиофайл взят из ALSACapture. Исходный код C здесь. Основная концепция заключается в том, чтобы открыть устройство захвата и необработанный аудиофайл, а затем циклически выполнить захват аудио и запись в файл с помощью Sox:

  Capture capture("default"); // open the default ALSA capture device
  Sox<int> sox;
  int ret=sox.openWrite("audio.raw", fs, capture.getChannels(), pow(2.,(double)snd_pcm_format_width(format)));
  while (continue){
    capture>>buffer;
    sox.write(buffer);
  }

Преимущество использования libsox в том, что вы не ограничены необработанным аудиоформатом.

person Matt    schedule 26.07.2020