2012-06-25 30 views
6

के माध्यम से तो मूल रूप से मैंने इसे पढ़ा, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htmइसे पंजीकृत किए बिना डायरेक्टशो फ़िल्टर का उपयोग करके, एक निजी CoCreateInstance

जो आपको बताता है कि उन्हें पंजीकरण किए बिना फ़िल्टर का उपयोग कैसे करें। दो तरीके हैं, नए हैं और एक निजी CoCreateInstance का उपयोग कर रहे हैं। मैं CoCreateInstance विधि का उपयोग करने की कोशिश कर रहा हूँ।

साइट कोड के रूप में सूचीबद्ध से नमूने में,

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

मेरे कोड इस प्रकार,

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

मैं IID_BaseFilter अनुमान लगा रहा हूँ क्या मैं चाहिए उपयोग करने के लिए, अपने क्या है मैं अन्य फिल्टर के लिए उपयोग करें। लेकिन मुझे त्रुटि दी गई है 'क्लासफैक्टरी अनुरोधित वर्ग की आपूर्ति नहीं कर सकता'।

क्या मुझे यहां कुछ याद आ रही है? किसी भी तरह की सहायता का स्वागत किया जाएगा। अग्रिम में धन्यवाद!

संपादित करें: कोड

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

उत्तर

5

आप फिर से पढ़ना चाहिए Using Filters Without Registration। दूसरा पैरामीटर CLSID है, वर्ग पहचानकर्ता, इंटरफ़ेस पहचानकर्ता नहीं (IBaseFilter)।

GDCL एमपीईजी -4 Demultiplexer के लिए, यह इस तरह है:

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

आह वाह, मैं पूरी तरह कि याद किया। मेरे अनुभवहीनता के लिए खेद है। अब मैंने मल्टीप्लेक्सर के लिए सीएलएसआईडी जोड़ा, जो कि अगर मैं गलत नहीं हूं तो एन्कोडर है? यह फ़िल्टर पाता है और फिर मैं \t IBaseFilterPtr pFilter = pUnk के साथ जारी रहता हूं; पीजीआरफ़-> AddFilter (पीएफलेटर, एल "निजी फ़िल्टर"); अब यह एन्कोड करने के लिए पर्याप्त नहीं होना चाहिए? फाइलसाइज पहले जैसा ही है। या मुझे आउटपुट प्रकार (और MEDIASUBTYPE_Avi) जैसे कुछ और बदलने की ज़रूरत है, वर्तमान है। मेरे लिए रोमन फिर से धन्यवाद, मेरी मदद करने में दृढ़ता, आप हीरो हैं :) –

+0

यह फ़िल्टर जोड़ने और इसका उपयोग करने के लिए पर्याप्त है। मुझे यकीन नहीं है कि आप इसे सही तरीके से उपयोग कर रहे हैं - आपको यह समझाने की ज़रूरत है कि आपके पास कौन सा ग्राफ टोपोलॉजी है और मीडिया पिन पर हैं। –

+0

ठीक है मैंने अपना कोड पहले पोस्ट में जोड़ा जो सबकुछ दिखाता है। –