【问题标题】:VP8-DirectShowFilter: QueryInterface results in E_NOINTERFACE (C++)VP8-DirectShowFilter:QueryInterface 结果为 E_NOINTERFACE (C++)
【发布时间】:2014-04-03 12:16:52
【问题描述】:

我是 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,我可以更改目标比特率,但我不知道如何在 C++ 中以编程方式执行此操作(我不想使用 PropertyPage)。 我还下载了源代码,找到并包含了文件 vp8encoder\vp8encoderfilter.hpp。这导致了我需要包含 vp8encoderidl.h 文件的问题。起初我没有在 soure 文件夹中找到这个文件,所以我从互联网的某个地方下载了它。后来我看到 IDL 文件夹包含一个 vp8encoder.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。所以我认为,可能第一个参数不正确,但我不知道需要哪个参数。

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

【问题讨论】:

    标签: c++ directshow vp8


    【解决方案1】:

    您实例化类 (CLSID_VP8Encoder) 并且类实现接口 (IBaseFilter, IVP8Encoder)。

    你的代码应该是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2012-07-13
      • 2010-10-30
      • 2017-04-26
      • 1970-01-01
      • 2012-01-15
      • 2019-06-22
      • 2018-07-30
      相关资源
      最近更新 更多