求支援,急!急!急! C++ MFC + DirectShow摄像头图像预览问题

求支援,急!急!急! C++ MFC + DirectShow + 自定义TransformFilter摄像头图像预览问题


C++ MFC + DirectShow + 自定义TransformFilter摄像头图像预览问题 )

问题描述:

1. 用Directshow实现用摄像头获取图像时,无法串接需要的Transform Filter,该摄像头数据格式为L8格式。
2. 自定义Filter是一个Transform Filter, 其格式将L8的Format转换为YUY2;
3. Transform Filter有注册,我把它定义在一个xxx_uuid.h文件中,
OUR_GUID_ENTRY(CLSID_L8Filter, 0x66bf678a, 0x8ff8, 0x41c6, 0xB6, 0xd, 0x4d, 0xe3, 0x62, 0x8, 0x2a, 0xc1)。(定义是成功的)

在Graphedit中可以与AVI Decompressor 串接后成功 Render.
在代码中,有Create Transform filter 及 AVI Decompressor filter并 使用AddFilter()加入Filter Graph Manager.
Filter Graph Manager如下:

在这里插入图片描述
——————————————————————————————————————————————

部分伪代码

CreateFilter() //伪代码
{
	//其他所需要Filter及Filter Graph Manager已经创建
	hr = CoCreateInstance(CLSID_L8Filter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&m_pL8filter);
    hr = CoCreateInstance(CLSID_AVIDec, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&m_pL8ADfilter); 
    hr = m_pGB->AddFilter(m_pL8filter, L"L8Converter");
	hr = m_pGB->AddFilter(m_pL8ADfilter, L"AVIDec");
}

连接Filter: 伪代码如下

ConnectFilterPin(IPin * pPin)   // pPin:  Capture Source 的Output Pin 
	{	
	 	HRESULT hr = S_OK;
    	IPin *pOut=NULL;// is used to connect
    	IPin *pIn=NULL;
    	hr=GetUnconnectedPin(m_pSTfilter,PINDIR_INPUT,&pIn);
    	m_pGB->Connect(pPin, pIn);
   		hr=GetUnconnectedPin(m_pSTfilter,PINDIR_OUTPUT,&pOut);

   	 	hr=GetUnconnectedPin(m_pSGFilter,PINDIR_INPUT,&pIn);
	    m_pGB->Connect(pOut, pIn);
    	hr=GetUnconnectedPin(m_pSTfilter,PINDIR_OUTPUT,&pOut);

    	hr=GetUnconnectedPin(m_pL8filter,PINDIR_INPUT,&pIn);
    	hr = m_pGB->Connect(pOut, pIn);

    	hr = GetUnconnectedPin(m_pL8filter, PINDIR_OUTPUT, &pOut);
    	hr = GetUnconnectedPin(m_pL8ADfilter, PINDIR_INPUT, &pPin);
    	**hr = m_pGB->Connect(pOut, pPin);
    	//前面连接都成功了,这一步连接就失败了,
    	//返回错误代码0x80040217: 未找到可用于建立连接的介质筛选器组合, 
    	//但是在Graphedit中却是可以连接并成功Render的。**
	    hr = GetUnconnectedPin(m_pL8ADfilter, PINDIR_OUTPUT, &pOut); 
		
		//之后还需要接Color Space Converter及Video Render.

}

//该函数通过枚举获取Filter上为连接的Pin。
GetUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{

}

有知道问题所在的大佬吗,还请多多指教!已经困扰我好久了,就是不知道是什么原因导致的。

———————————————————————————————————

新发现

Build出来的 exe 可以连接TransformFilter运行,但是在Debug模式下就会出现上述的连接失败问题。在CSDN也下载了个测试程序,也发现了同样的问题。

目前猜测是VS环境与Windows不同,在VS下没有的到Windows某些COM组件功能的支持,当然这个只是推测,这部分我不清楚。
所以目前的解决方案是将Build出来的exe运行起来,用VS Debug菜单下的Attach to Procces,选择需要运行的exe来Debug。
后期如果有新发现再更新,若有大佬知晓其中缘由,还请告之,小弟感激不尽!

———————————————————————————————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值