Запись аудио и сохранение в файл с помощью WASAPI С++
Возможно ли в библиотеке WASAPI записывать аудио данные сначала в буфер, а потом по какому то событию (например клику на кнопку) сохранять их в файл. Проблема в том, что примеры которые я находил (ну, например этот или этот пишут данные сразу в файл. Ну и не только эти примеры. В принципе то, что я видел, там сразу создается файл и копируются в него данные, по окончанию записи файл закрывается. Хотелось бы разделить логику сохранения захваченных данных и их последующую запись в файл.
UPD:
сделал запись в буфер как в примере. Запись в файл также. Только в методе RecordAudioStream вместо
// Copy the available capture data to the audio sink.
hr = pMySink->CopyData(
pData, numFramesAvailable, &bDone, pwfx, (HMMIO)hFile);
EXIT_ON_ERROR(hr)
копирую данные в буфер и буфер сохраняю в мапу:
BYTE * buffer = new BYTE[(numFramesAvailable * pwfx->nBlockAlign)];
memcpy(buffer, pData, numFramesAvailable * pwfx->nBlockAlign);
m_curAudioData.insert({buffer, numFramesAvailable});
А затем в отдельном потоке мапу сохраняю в файл:
std::map<BYTE *, UINT32> audioData;
audioData.insert(m_curAudioData.begin(), m_curAudioData.end());
if (m_writerThread.joinable())
m_writerThread.join();
m_writerThread = std::thread(std::bind([this, audioData](){
CoInitializeEx(NULL, COINIT_MULTITHREADED);
WavWriter wav_file(pwfx);
wav_file.CreateWAVFile();
wav_file.WriteWaveHeader();
for (const auto & [data, numFrames] : audioData)
{
wav_file.CopyData(data, numFrames);
}
wav_file.FinishWaveFile();
wav_file.CloseFile();
CoUninitialize();
}));
m_writerThread.detach();
Звук пишется, однако его качество достаточно плохое (есть шумы, дребизжания, и скорость воспроизведения тянется).
Ответы (1 шт):
В рамках WASAPI вы получаете (record) данные и, конечно же, необходимости моментально писать из куда-то нет. Аудиоданные не имеют неприлично большого размера, так что вполне можно накапливать в памяти приличные объемы перед тем как решать что с ними делать. Одновременно, кодеки аудио данные работают достаточно быстро для текущей техники, так что тоже вполне можно набрать данных, а потом нагнать их обработку за счет ускоренного кодирования.
По большому счету помимо того, чтобы удерживать данные в памяти вам бы также хотелось ассоциировать эти данные с какими-то временными метками с тем, чтобы понимать какие данные идут последовательно, а в каких есть разрыв (к примере, на моменте система была чем-то перегружена и часть данных была потеряна) - с тем чтобы при создании файла это было учтено.