VP8-DirectShowFilter:QueryInterface导致E_NOINTERFACE(C ++)

时间:2014-04-03 12:16:52

标签: c++ directshow vp8

我是Directshow和C ++的新手。我尝试从源捕获视频并使用VP8对其进行编码。为了实现这一目标,我正在使用来自https://code.google.com/p/webm/downloads/list的DirectShow-Filters 我的Filtergraph正在运行,由以下四个过滤器组成:

recorder -> WebM VP8 Encoder Filter -> WebM Muxer Filter -> FileWriter

问题是,我需要更改VP8编码器过滤器的属性。使用GraphEdit,我可以更改例如Targed Bitrate,但我不知道如何在C ++中以编程方式执行此操作(我不想使用PropertyPage)。 我还下载了源代码,发现并包含了文件vp8encoder \ vp8encoderfilter.hpp。这导致我需要包含vp8encoderidl.h文件的问题。起初我没有在soure文件夹中找到这个文件,所以我从互联网的某个地方下载了它。后来我看到了包含vp8encoder.idl文件的IDL文件夹,我将其添加到我的项目中,编译它并包含生成的vp8encoder_h.h文件。在这两种情况下(使用来自Internet的代码或来自头文件),我可以编译我的项目并录制视频。所以我试图从DirectShow过滤器中获取IVP8Encoder接口:

//Instanziate Encoder-Filter
hr = CoCreateInstance(__uuidof(IVP8Encoder), NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVideoEncoder);

//Get Interface
IVP8Encoder *iEncoder = NULL;
hr = pVideoEncoder->QueryInterface(__uuidof(IVP8Encoder), (void**)&iEncoder);

QueryInterface() - 方法返回E_NOINTERFACE。所以我想,可能第一个参数不正确,但我不知道需要哪个参数。

我感谢您的帮助,并提前致谢!

1 个答案:

答案 0 :(得分:0)

实例化类(CLSID_VP8Encoder),类实现接口(IBaseFilterIVP8Encoder)。

您的代码应为:

IBaseFilter* pVideoEncoder;
hr = CoCreateInstance(CLSID_VP8Encoder, NULL, CLSCTX_INPROC_SERVER, 
    IID_IBaseFilter, (void**) &pVideoEncoder);
IVP8Encoder *iEncoder = NULL;
hr = pVideoEncoder->QueryInterface(__uuidof(IVP8Encoder), (void**) &iEncoder);