2014-04-03 4 views
0

입니다. DirectShow 및 C++의 새로운 기능입니다. 소스에서 비디오를 캡처하고 VP8로 인코딩하려고합니다. 내가 https://code.google.com/p/webm/downloads/list
내 Filtergraph에서의 DirectShow 필터를 사용하고이를 달성하기 위해 노력하고 이러한 4 개 개의 필터로 구성되어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 폴더에서이 파일을 찾지 못했기 때문에 인터넷의 어딘가에서 다운로드했습니다. 나중에 프로젝트에 추가 한 vp8encoder.idl 파일이 들어있는 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)를 인스턴스화하고 클래스는 인터페이스 (, 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);