Я пытаюсь записать .wav
с помощью directshow framework
в проекте Visual Studio 2010 C++. Я следую разделу WAV файла этого руководства: https://msdn.microsoft.com/en-us/library/windows/desktop/dd375005(v=vs.85).aspxCoCreateInstance создает пустой IBaseFilter для CLSID_WavDest
Я построил WavDest.dll
, добавил его в реестр, нашел его в реестре, его можно добавить в качестве фильтра в Graphedit. У меня была нерешенная внешняя ошибка символа для _CLSID_WavDest
, но она исправила ее, включив InitGuid.h
в мой StdAfx.h
и связав WavDest.lib
.
Теперь у меня нет ошибок, программа не сбой, но я получаю 0 байт wav-файла.
Раздел кода:
res = AddFilterByCLSID(dshow_dev->m_pGraph, CLSID_WavDest, (IBaseFilter **)&dshow_dev->m_pWaveDest, L"WavDest");
res = AddFilterByCLSID(dshow_dev->m_pGraph, CLSID_FileWriter, (IBaseFilter **)&dshow_dev->m_pWaveWriter, L"File Writer");
res = dshow_dev->m_pWaveWriter->QueryInterface(IID_IFileSinkFilter, (void**)&dshow_dev->m_pFileSink);
res = dshow_dev->m_pFileSink->SetFileName(L"D:\\test.wav", NULL);
res = ConnectFilters(dshow_dev->m_pGraph, dshow_dev->m_pCaptureSourceAudio, dshow_dev->m_pWaveDest);
res = ConnectFilters(dshow_dev->m_pGraph, dshow_dev->m_pWaveDest, dshow_dev->m_pWaveWriter);
AddFilterByCLSID
для CLSID_WavDest
возвращает S_OK, но dshow_dev->m_pWaveDest
имеет следующие значения: -
[CWavDestFilter] {m_cbWavData=0x00000000 m_cbHeader=0x00000000 } CWavDestFilter
.
Поэтому ConnectFilters
за m_pWaveDest
возвращает E_Fail
и аудио не записывается.
Я пробовал это с версиями отладки и выпуска WavDest.dll
зарегистрированных (сначала Debug, затем unreg Debug и reg Release).
Я проверил все остальное в коде, граф (dshow_dev->m_pGraph
) отлично работает для предварительного просмотра видео и записи файла AVI (со звуком).
Уверен, что я сделал что-то не так с интеграцией WavDest, но я не знаю, что.
Любая помощь приветствуется.
Вам нужно отлаживать дальше прибить ошибку вниз. Вы можете входить в 'ConnectFilters', вы можете установить точку останова в' CWavDestFilter :: CheckInputType' со стороны фильтра, вы можете подключиться с использованием определенного типа звукового носителя. До сих пор не было намека, почему ошибка происходит именно так. –
Кроме того, заголовок вопроса вводит в заблуждение и, в общем, не имеет смысла. –