그래서 나는 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();
}
}
와우 아, 나는 완전히 그것을 놓쳤다. 나의 미숙함을 유감스럽게 생각합니다. 이제 멀티플렉서에 대한 CLSID를 추가했는데, 잘못 입력하지 않은 경우 엔코더가 추가 되었습니까? 필터를 찾은 다음 계속합니다. \t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter (pFilter, L "Private Filter"); 이제 인코딩 할만큼 충분하지 않아야합니까? 파일 크기는 이전과 거의 같습니다. 또는 출력 유형 (& MEDIASUBTYPE_Avi)과 같은 것을 변경해야 할 필요가 있습니까? 고마워요. 다시 로마님께 도움을 청했습니다. 영웅입니다. –
필터를 추가하고 사용하는 것으로 충분합니다. 나는 당신이 그것을 정확하게 사용하고 있는지 확신하지 못한다. 당신은 당신이 가지고있는 그래프 토폴로지와 핀에있는 미디어 타입을 설명 할 필요가있다. –
좋아, 모든 것을 보여주는 첫 번째 게시물에 내 코드를 추가했습니다. –