2012-06-25 21 views
6

Vì vậy, basiclly tôi đọc này, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm.Sử dụng bộ lọc DirectShow mà không cần đăng ký, thông qua một CoCreateInstance riêng

Cho bạn biết cách sử dụng bộ lọc mà không cần đăng ký chúng. Có hai phương pháp, mới và sử dụng CoCreateInstance riêng. Tôi đang cố sử dụng phương thức CoCreateInstance.

Trong mẫu từ các trang web mã được liệt kê như,

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ã của tôi như sau,

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

Tôi đoán IID_BaseFilter là những gì Im được phép sử dụng, những gì của nó tôi sử dụng cho các bộ lọc khác. Nhưng tôi đã đưa ra lỗi 'ClassFactory không thể cung cấp lớp được yêu cầu'.

Tôi có thiếu gì đó ở đây không? Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn trước!

EDIT: Mã

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

Trả lời

5

Bạn nên đọc lại Using Filters Without Registration. Tham số thứ hai là CLSID, số nhận dạng lớp, không phải là mã định danh giao diện (IBaseFilter).

Đối với GDCL MPEG-4 demultiplexer, nó là như thế này:

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

Ah wow, tôi hoàn toàn bị mất đó. Xin lỗi vì sự thiếu kinh nghiệm của tôi. Bây giờ tôi đã thêm CLSID cho Multiplexer, bộ mã hóa nếu tôi không nhầm? Nó tìm thấy bộ lọc và sau đó tôi tiếp tục với \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Private Filter"); Bây giờ không nên đủ để mã hóa? Các filesize là về giống như trước. Hoặc tôi có cần phải thay đổi một cái gì đó giống như loại đầu ra (& MEDIASUBTYPE_Avi), là hiện tại. Cũng nhờ một lần nữa La Mã cho bạn kiên trì trong việc giúp tôi, bạn là một anh hùng :) –

+0

Điều này là đủ để thêm bộ lọc và sử dụng nó. Tôi không chắc liệu bạn đang sử dụng nó một cách chính xác - bạn cần phải giải thích topo đồ thị bạn có và các loại phương tiện truyền thông trên chân. –

+0

Được rồi, tôi đã thêm mã của mình vào bài đăng đầu tiên hiển thị mọi thứ. –

Các vấn đề liên quan