关于directshow 视频采集问题

lgqzlx 2011-12-10 07:14:46
我用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函数一直没被调用。

请问高手这是怎么回事,我应该怎么做。
...全文
31 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧