2016-11-18 2 views
0

Ich versuche, .wav mit directshow framework in C++ Visual Studio 2010-Projekt aufzeichnen. Ich befolge WAV-Datei Abschnitt dieses Handbuchs: https://msdn.microsoft.com/en-us/library/windows/desktop/dd375005(v=vs.85).aspxCoCreateInstance erstellt leere IBaseFilter für CLSID_WavDest

Ich habe WavDest.dll gebaut, es zur Registrierung hinzugefügt, in der Registrierung gefunden, kann es als Filter in Graphedit hinzugefügt werden. Ich hatte externen Symbolfehler für _CLSID_WavDest ungelöst aber hatte es durch das Einschließen InitGuid.h in meinem StdAfx.h und durch das Verbinden der WavDest.lib behoben.

Jetzt bekomme ich keine Fehler, Programm stürzt nicht ab, aber ich bekomme 0 Byte WAV-Datei.

Abschnitt von Code:

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 für CLSID_WavDest S_OK aber dshow_dev->m_pWaveDest hat folgende Werte: -

[CWavDestFilter] {m_cbWavData=0x00000000 m_cbHeader=0x00000000 } CWavDestFilter 

.

Daher ConnectFilters für m_pWaveDest zurück E_Fail und keine Audio aufgezeichnet ist.

Ich habe versucht, dies mit beiden Debug und Release-Versionen von WavDest.dll registriert (zuerst Debug, dann unreg Debug und reg Release).

Ich habe alles andere in Code überprüft, Grafik (dshow_dev->m_pGraph) läuft gut für Videovorschau und Schreiben von AVI-Datei (mit Audio).

Ich bin sicher, dass ich etwas falsch mit WavDest Integration getan habe, aber ich weiß nicht was.

Jede Hilfe wird geschätzt.

+0

Sie müssen weiter debuggen den Fehler nach unten nageln. Sie können in 'ConnectFilters' gehen, Sie können den Haltepunkt in' CWavDestFilter :: CheckInputType' auf der Filterseite setzen, Sie können sich mit einem bestimmten Audiomedientyp verbinden. Bisher gibt es keine Hinweise, warum der Fehler genau passiert. –

+0

Auch der Titel der Frage ist irreführend und macht im Allgemeinen keinen Sinn. –

Antwort

0

Es war schließlich mein Fehler. Ich habe

ersetzt
assert(pResult != NULL); 

in dieser Funktion

// 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; 
} 

mit

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