2014-04-03 44 views
0

我是Directshow和C++中的新成员。我尝试从源捕捉视频并使用VP8对其进行编码。要做到这一点我使用DirectShow的过滤器从https://code.google.com/p/webm/downloads/list
FilterGraph动态我正在工作,由这四种过滤器:VP8-DirectShowFilter:QueryInterface结果为E_NOINTERFACE(C++)

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

的问题是,我需要的属性从VP8编码器更换过滤器。使用GraphEdit,我可以改变例如Targed Bitrate,但我不知道如何以C++编程(我不想使用PropertyPage)。 我也下载了源代码并找到并包含了文件vp8encoder \ vp8encoderfilter.hpp。这导致了我需要包含vp8encoderidl.h文件的问题。起初,我没有在soure文件夹中找到这个文件,所以我从互联网上的某个地方下载了它。后来,我看到IDL文件夹包含一个vp8encoder.idl文件,我将其添加到我的项目中,编译它并包含生成的vp8encoder_h.h文件。在这两种情况下(使用互联网或头文件的代码),我可以编译我的项目并录制视频。于是,我就从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。所以我认为,这可能是第一个参数不正确,但我不知道需要哪个参数。

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

回答

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);