2012-06-25 15 views
6

Quindi, basicamente, ho letto questo, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm.Utilizzo di un filtro DirectShow senza registrarlo, tramite una CoCreateInstance privata

Che indica come utilizzare i filtri senza registrarli. Esistono due metodi, nuovi e che utilizzano una CoCreateInstance privata. Sto cercando di utilizzare il metodo CoCreateInstance.

Nel campione dal sito il codice è elencato come,

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

Il mio codice come segue,

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

Sto indovinando IID_BaseFilter è ciò che Im suppone di utilizzare, il suo quello che ho usare per altri filtri. Ma mi viene dato l'errore "ClassFactory non può fornire la classe richiesta".

Mi manca qualcosa qui? Qualsiasi aiuto sarebbe molto apprezzato. Grazie in anticipo!

EDIT: codice

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(); 
    } 
} 

risposta

5

Si dovrebbe rileggere Using Filters Without Registration. Il secondo parametro è CLSID, l'identificatore di classe, non l'identificatore di interfaccia (IBaseFilter).

Per la GdCl MPEG-4 Demultiplexer, è in questo modo:

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

Ah wow, ho completamente perso. Mi dispiace per la mia inesperienza. Ora ho aggiunto il CLSID per il multiplexer, che è l'encoder se non mi sbaglio? Trova il filtro e quindi continuo con \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Filtro privato"); Ora non dovrebbe essere sufficiente per codificare? La dimensione del file è circa la stessa di prima. O devo cambiare qualcosa di più come il tipo di output (& MEDIASUBTYPE_Avi), è la corrente. Inoltre grazie ancora Roman per la tua perseveranza nell'aiutarmi, sei un eroe :) –

+0

Questo è sufficiente per aggiungere il filtro e usarlo. Non sono sicuro che tu stia usando correttamente - devi spiegare quale topologia grafica hai e i tipi di media sui pin. –

+0

Va bene, ho aggiunto il mio codice al primo post che mostra tutto. –

Problemi correlati