2016-11-18 24 views
0

Я пытаюсь записать .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, но я не знаю, что.

Любая помощь приветствуется.

+0

Вам нужно отлаживать дальше прибить ошибку вниз. Вы можете входить в 'ConnectFilters', вы можете установить точку останова в' CWavDestFilter :: CheckInputType' со стороны фильтра, вы можете подключиться с использованием определенного типа звукового носителя. До сих пор не было намека, почему ошибка происходит именно так. –

+0

Кроме того, заголовок вопроса вводит в заблуждение и, в общем, не имеет смысла. –

ответ

0

Это была моя ошибка в конце концов. Я заменил

assert(pResult != NULL); 

в этой функции

// Match a pin by pin direction and connection state. 
HRESULT MatchPin(IPin *pPin, PIN_DIRECTION direction, BOOL bShouldBeConnected, BOOL *pResult) 
{ 
    assert(pResult != NULL); 

    BOOL bMatch = FALSE; 
    BOOL bIsConnected = FALSE; 

    HRESULT hr = IsPinConnected(pPin, &bIsConnected); 
    if (SUCCEEDED(hr)) 
    { 
     if (bIsConnected == bShouldBeConnected) 
     { 
      hr = IsPinDirection(pPin, direction, &bMatch); 
     } 
    } 

    if (SUCCEEDED(hr)) 
    { 
     *pResult = bMatch; 
    } 
    return hr; 
} 

с

if(pResult == NULL); 
{ 
    HRESULT hr = E_FAIL; 
    return hr; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^