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。
后期如果有新发现再更新,若有大佬知晓其中缘由,还请告之,小弟感激不尽!
———————————————————————————————————