2012-06-25 6 views
6

Tak więc po prostu czytam to, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm.Korzystanie z filtru DirectShow bez rejestracji, za pośrednictwem prywatnej CoCreateInstance

Który mówi, jak używać filtrów bez ich rejestrowania. Istnieją dwie metody, nowa i używanie prywatnej CoCreateInstance. Próbuję użyć metody CoCreateInstance.

W próbce z witryny kod jest podany,

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

Mój kod w następujący sposób

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

Zgaduję IID_BaseFilter, co Im powinien używać, jej co ja użyj dla innych filtrów. Ale dostaję błąd "ClassFactory nie może dostarczyć żądanej klasy".

Czy tu czegoś brakuje? Każda pomoc będzie bardzo ceniona. Z góry dziękuję!

EDIT: Kod

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

Odpowiedz

5

Należy ponownie przeczytać Using Filters Without Registration. Drugi parametr to CLSID, identyfikator klasy, a nie identyfikator interfejsu (IBaseFilter).

Dla GDCL demultiplekser MPEG-4, to jest tak:

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

Ah wow, ja całkowicie przeoczyć. Przepraszamy za niedoświadczenie. Teraz dodałem CLSID dla multipleksera, który jest enkoderem, jeśli się nie mylę? Znajduje filtr, a następnie kontynuuję pracę z \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Filtr prywatny"); Czy to nie powinno wystarczyć do kodowania? Rozmiar pliku jest mniej więcej taki sam jak wcześniej. Czy muszę zmienić coś bardziej jak typ wyjściowy (i MEDIASUBTYPE_Avi), jest obecny. Jeszcze raz dziękuję Romanowi za wytrwałość w pomaganiu mi, jesteś bohaterem :) –

+0

Wystarczy, że dodasz filtr i go użyjesz. Nie jestem pewien, czy używasz go poprawnie - musisz wyjaśnić, jaka jest topologia wykresu i typy mediów na szpilkach. –

+0

W porządku Dodałem mój kod do pierwszego wpisu, który pokazuje wszystko. –

Powiązane problemy