2012-06-25 19 views
6

kullanarak, temel olarak bunu okudum, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm.Bir DirectShow filtresini, kaydetmeden, özel bir CoCreateInstance

Filtreleri, bunları kaydetmeden nasıl kullanacağınızı anlatır. Özel bir CoCreateInstance kullanarak yeni ve iki yöntem vardır. CoCreateInstance yöntemini kullanmaya çalışıyorum. kod olarak listelenen sitesinden örneklemde

,

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

Kodum aşağıdaki gibi

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

Ben IID_BaseFilter tahmin ediyorum Im, onun ne sözde kullanmak ne ben diğer filtreler için kullanın. Ama 'ClassFactory istenen sınıfı sağlayamıyor' hatası verildi.

Burada bir şey mi özlüyorum? Herhangi bir yardım büyük takdir edilecektir. Şimdiden teşekkürler!

DÜZENLEME: Kod Sen Using Filters Without Registration yeniden okumak gerektiğini

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

cevap

5

. İkinci parametre CLSID, sınıf tanımlayıcısı, arabirim tanımlayıcısı değil (IBaseFilter). GDCL MPEG-4 Demultiplexer için

, bu şu şekildedir:

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

vay Ah, tamamen bu cevapsız. Deneyimlerim için özür dilerim. Şimdi Multiplexer için CLSID ekledim, eğer yanılmıyorsam enkoder hangisi? Filtreyi bulur ve ardından \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Özel Filtre"); Şimdi kodlamak için yeterli olmamalı mı? Dosyalama önceki ile aynıdır. Ya da çıkış tipi (& MEDIASUBTYPE_Avi) gibi bir şeyi daha fazla değiştirmem gerekiyor, akımdır. Ayrıca bana tekrar teşekkür etmek için Roma'ya tekrar teşekkürler, siz bir kahramansınız :) –

+0

Bu, filtreyi eklemek ve kullanmak için yeterlidir. Doğru şekilde kullanıp kullanmadığınızdan emin değilim - sahip olduğunuz grafik topolojisini ve medya türlerini pimler üzerinde açıklamanız gerekir. –

+0

Pekala, kodumu her şeyi gösteren ilk gönderiye ekledim. –

İlgili konular