2012-06-25 6 views
6

그래서 나는 basiclly http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm을 읽었습니다.DirectShow 필터를 등록하지 않고 사설 CoCreateInstance를 통해 사용하기

필터를 등록하지 않고 사용하는 방법을 알려줍니다. 새로운 메소드와 private 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을 추측하고있어 메신저, 그 무엇을 가정을 사용하는 것입니다 I 다른 필터에 사용하십시오. 하지만 'ClassFactory가 요청한 클래스를 제공 할 수 없습니다'라는 오류가 표시됩니다.

여기에 뭔가가 있습니까? 어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다!

편집 : 코드 당신은 Using Filters Without Registration을 다시 읽어해야

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

. 두 번째 매개 변수는 인터페이스 식별자 (IBaseFilter)가 아닌 클래스 식별자 인 CLSID입니다. GDCL MPEG-4 디멀티플렉서를 들어

, 그것은 다음과 같이이다 :

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

와우 아, 나는 완전히 그것을 놓쳤다. 나의 미숙함을 유감스럽게 생각합니다. 이제 멀티플렉서에 대한 CLSID를 추가했는데, 잘못 입력하지 않은 경우 엔코더가 추가 되었습니까? 필터를 찾은 다음 계속합니다. \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Private Filter"); 이제 인코딩 할만큼 충분하지 않아야합니까? 파일 크기는 이전과 거의 같습니다. 또는 출력 유형 (& MEDIASUBTYPE_Avi)과 같은 것을 변경해야 할 필요가 있습니까? 고마워요. 다시 로마님께 도움을 청했습니다. 영웅입니다. –

+0

필터를 추가하고 사용하는 것으로 충분합니다. 나는 당신이 그것을 정확하게 사용하고 있는지 확신하지 못한다. 당신은 당신이 가지고있는 그래프 토폴로지와 핀에있는 미디어 타입을 설명 할 필요가있다. –

+0

좋아, 모든 것을 보여주는 첫 번째 게시물에 내 코드를 추가했습니다. –