关于directshow 视频采集问题
我用directshow 已经实现了视频浏览,我的目的是从采集卡上的filter,传递到一个发送filter,这个filter采用input pin,和采集卡上的filter output pin连击,现在问题是我无法从继承的CBaseInputPin的Receive函数中得到视频数据,就是说采集数据没有传递到input pin来。
下面我把部分代码贴上来,敬请高手不惜赐教:
typedef struct VideoFilter
{
IBaseFilter * _ifilter;
TransFilter * _trans_filter;
SendFilter * _send_filter;
IVideoWindow * _ivideo_wnd;
IMediaControl * _imedia_ctl;
IMediaEventEx * _imedia_event;
IGraphBuilder * _graph_builder;
ICaptureGraphBuilder2 * _capture_builder;
CCritSec * _lock;
TCHAR _video_name[64];
ULONG _fetched;
VideoFilter() {
memset(this, 0, sizeof(VideoFilter));
}
}VideoFilter; 这个结构定义了一个视频相关的成员参数
我的步骤:
1、枚举所有可用设备
2、建立graphbuilder、capturegraphbuilder2 、iMediaControl,iVideoWindow接口
3、开始采集部分代码:
int VideoCap::start_capture()
{
int i;
HRESULT hr;
IAMStreamConfig * stream_config;
GUID guid;
guid = MEDIASUBTYPE_Avi;
for(i = 0; i < _filter_nums; i++) {
if(_video_filter[i]._capture_builder) {
hr = _video_filter[i]._capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
_video_filter[i]._ifilter, //ifilter成员是采集卡的源 filter
IID_IAMStreamConfig,
(void**)&stream_config);
if(hr == NOERROR) {
set_media_type(stream_config, NULL); //此函数设置媒体数据采集大小、帧等参数
}
hr = _video_filter[i]._capture_builder->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
_video_filter[i]._ifilter,
NULL,
_video_filter[i]._send_filter); //获取视频的用了SendFilter类,这个类继承自CBaseFilter。
//获取源filter的output pin
IPin * output_pin = filter_pin(_video_filter[i]._ifilter, PINDIR_OUTPUT);
//获取SendFilter的input pin
CBasePin * input_pin = _video_filter[i]._send_filter->GetPin(1);
//建立链接
if(output_pin && input_pin) {
_video_filter[i]._graph_builder->Disconnect(output_pin);
_video_filter[i]._graph_builder->Connect(output_pin, input_pin);
input_pin->Release();
output_pin->Release();
}
//建立预览
hr = _video_filter[i]._capture_builder->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
_video_filter[i]._ifilter,
NULL,
NULL);
//开始采集
if(SUCCEEDED(hr)) {
_video_filter[i]._imedia_ctl->Run();
}
}
}
return VIDEO_OK;
}
上述就是我实现采集的函数,但是我继承自CBaseInputPin的Receive函数一直没被调用。
请问高手这是怎么回事,我应该怎么做。