directshow — VP8-DirectShowFilter: QueryInterface приводит к E_NOINTERFACE (C ++)

Я новичок в Directshow и C ++. Я пытаюсь захватить видео из источника и кодировать его с помощью VP8. Для этого я использую DirectShow-Filters из https://code.google.com/p/webm/downloads/list
Мой Filtergraph работает и состоит из следующих четырех фильтров:

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. В обоих случаях (с кодом из Интернета или из заголовочного файла) я могу скомпилировать свой проект и записать видео. Поэтому я попытался получить интерфейс IVP8Encoder из фильтра DirectShow:

//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) и классы реализуют интерфейсы (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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]