So, I just read this, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm .
Tells you how to use filters without registering them. There are two methods: new and using private CoCreateInstance. I am trying to use the CoCreateInstance method.
In the sample from the site, the code is indicated as
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); }
My code is as follows:
IUnknownPtr pUnk; HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk); if (SUCCEEDED(hr)) {
I assume that IID_BaseFilter is what I should use, its what I use for other filters. But I was given the error "ClassFactory cannot provide the requested class."
Am I missing something? Any help would be greatly appreciated. Thanks in advance!
EDIT: Code
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(); } }