C++ 通过私有CoCreateInstance使用DirectShow筛选器而不注册它

C++ 通过私有CoCreateInstance使用DirectShow筛选器而不注册它,c++,encoding,com,directshow,mpeg-4,C++,Encoding,Com,Directshow,Mpeg 4,所以基本上我读到了这个 它告诉您如何在不注册过滤器的情况下使用过滤器。有两种方法,新建和使用私有CoCreateInstance。我正在尝试使用CoCreateInstance方法 在现场样本中,代码如下所示: IUnknownPtr pUnk; HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk); if (SUCCEEDED(hr)) { IBase

所以基本上我读到了这个

它告诉您如何在不注册过滤器的情况下使用过滤器。有两种方法,新建和使用私有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是我应该使用的,它是我用于其他过滤器的。但我得到了错误“ClassFactory无法提供请求的类”

我是不是遗漏了什么?任何帮助都将不胜感激。提前谢谢

编辑:代码

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
,而不是接口标识符(
IBaseFilter

对于GDCL MPEG-4解复用器,如下所示:

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

啊,哇,我完全错过了。对不起,我没有经验。现在我为多路复用器添加了CLSID,如果我没弄错的话,这就是编码器?它找到过滤器,然后我继续使用IBaseFilterPtr pFilter=pUnk;pGraph->AddFilter(pFilter,L“专用过滤器”);这难道不足以编码吗?文件大小与以前大致相同。或者我是否需要更改一些更像输出类型(&MEDIASUBTYPE_Avi)的内容,这是当前的。再次感谢罗曼,感谢你坚持不懈地帮助我,你是一个英雄:)这足以添加过滤器并使用它。我不确定你是否正确使用它-你需要解释你有什么图形拓扑和引脚上的媒体类型。好吧,我在第一篇文章中添加了我的代码,显示了所有内容。这是一个混乱的方式:AVI不是MP4。如果您正在写入MP4,请使用
AddFilter
+
Connect
,不使用MEDIASUBTYPE_Avi等来构建它。您只需在MP4多路复用器过滤器的输出上添加文件编写器来完成
RenderStream
s即可(您可以使用GraphEdit进行培训以了解其工作原理)。好的,再次感谢您查看我的代码。我将查看FileWriter,看看是否可以解决它:)