2012-06-25 14 views
6

So grundlegend lese ich dies, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm.Verwenden eines DirectShow-Filters ohne Registrierung über eine private CoCreateInstance

Welche zeigt Ihnen, wie Sie Filter verwenden, ohne sie zu registrieren. Es gibt zwei neue Methoden, die eine private CoCreateInstance verwenden. Ich versuche, die CoCreateInstance-Methode zu verwenden.

In der Probe von der Website des Code wie aufgeführt wird

IUnknownPtr pUnk; 
HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk); 
if (SUCCEEDED(hr)) 
{ 
    IBaseFilterPtr pFilter = pUnk; 
    pGraph->AddFilter(pFilter, L"Private Filter"); 
    pGraph->RenderFile(pMediaClip, NULL); 
} 

Mein Code wie folgt,

IUnknownPtr pUnk; 
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk); 
if (SUCCEEDED(hr)) 
{ 
    //add functionality 
} 

ich IID_BaseFilter erraten ist, was sollte Im, das zu verwenden, was ich Verwenden Sie für andere Filter. Aber ich habe den Fehler 'ClassFactory kann angeforderte Klasse nicht liefern' gegeben.

Fehle ich hier etwas? Jede Hilfe würde sehr geschätzt werden. Danke im Voraus!

EDIT: Code

IBaseFilter *pSrc = NULL, *pSrc2 = NULL, *pWaveDest = NULL, *pWriter = NULL; 
IFileSinkFilter *pSink= NULL; 
IGraphBuilder *pGraph; 
ICaptureGraphBuilder2 *pBuild; 
IMediaControl *pControl = NULL; 
// This example omits error handling. 

hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, 
    IID_ICaptureGraphBuilder2, (void**)&pBuild); 

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); 
//Initialize the Capture Graph Builder 
hr = pBuild->SetFiltergraph(pGraph); 

// Not shown: Use the System Device Enumerator to create the 
// audio capture filter. 
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc); 
hr = pGraph->AddFilter(pSrc, L"VideooCap"); 

hr = pMoniker2->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc2); 
hr = pGraph->AddFilter(pSrc2, L"AudioCap"); 

IBaseFilter *pMux; 
//IFileSinkFilter *pSink; 
hr = pBuild->SetOutputFileName(
    &MEDIASUBTYPE_Avi, // Specifies AVI for the target file. 
    L"C:\\wav\\Example2.mp4", // File name. 
    &pMux,    // Receives a pointer to the mux. 
    NULL);    // (Optional) Receives a pointer to the file sink. 

IUnknownPtr pUnk; 
//static CLSID const clsid = { 0x025BE2E4, 0x1787, 0x4DA4, { 0xA5,0x85,0xC5,0xB2,0xB9,0xEE,0xB5,0x7C } }; 

static CLSID const clsid = { 0x5FD85181, 0xE542, 0x4e52, { 0x8D,0x9D,0x5D,0x61,0x3C,0x30,0x13,0x1B } }; 
//5FD85181-E542-4e52-8D9D5D613C30131B 
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4mux.dll"), clsid, &pUnk); 
if (SUCCEEDED(hr)) 
{ 
    IBaseFilterPtr pFilter = pUnk; 
    HRESULT hr = pGraph->AddFilter(pFilter, L"Private Filter"); 
} 

hr = pBuild->RenderStream(
    NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category. 
    NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio,  // Media type. 
    pSrc,     // Capture filter. 
    NULL,     // Intermediate filter (optional). 
    pMux);     // Mux or file sink filter. 

hr = pBuild->RenderStream(
    NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category. 
    NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio,  // Media type. 
    pSrc2,     // Capture filter. 
    NULL,     // Intermediate filter (optional). 
    pMux);     // Mux or file sink filter. 

    IMediaControl *pMC = NULL; 
    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC); 
    printf("START"); 
    hr = pMC->Run(); 
    Sleep(4000); 
     hr = pMC->Stop(); 
    printf("END"); 
CoUninitialize(); 
    } 
} 

Antwort

5

Sie sollten Using Filters Without Registration ablesbare sind. Der zweite Parameter ist CLSID, der Klassenbezeichner, nicht der Schnittstellenbezeichner (IBaseFilter).

Für die GdCl MPEG-4-Demultiplexer, ist es dies wie:

class __declspec(uuid("025BE2E4-1787-4DA4-A585-C5B2B9EEB57C")) GdclMp4Demux; // GDCL Mpeg-4 Demultiplexor 
... = CreateObjectFromPath(..., __uuidof(GdclMp4Demux), ...); 
+0

Ah wow, ich völlig verpasst. Entschuldigung für meine Unerfahrenheit. Jetzt habe ich die CLSID für den Multiplexer hinzugefügt, welches ist der Encoder, wenn ich mich nicht irre? Es findet den Filter und dann fahre ich fort mit \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Privater Filter"); Jetzt sollte das nicht genug sein, um zu kodieren? Die Dateigröße ist ungefähr die gleiche wie zuvor. Oder muss ich etwas mehr wie Ausgabetyp ändern (& MEDIASUBTYPE_Avi), ist der aktuelle. Danke auch nochmal Roman für dich beharr mich behilflich, du bist ein Held :) –

+0

Das reicht um den Filter hinzuzufügen und zu benutzen. Ich bin mir nicht sicher, ob Sie es richtig verwenden - Sie müssen erklären, welche Diagrammtopologie Sie haben und welche Medientypen an Pins sind. –

+0

Okay, ich habe meinen Code dem ersten Post hinzugefügt, der alles anzeigt. –

Verwandte Themen