GraphBuilder播放一次文件后(播放视频采集没有问题)有个残留的ActiveMovieWindow窗口,再播放就又出了一个,这个问题在2k下没有,只在xp上出现了.
验证此现象的代码:
mfc的dlg的测试代码:
#pragma comment(lib,"quartz.lib")
#pragma comment(lib,"vfw32.lib")
#pragma comment(lib,"quartz.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"version.lib")
#pragma comment(lib,"largeint.lib")
IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEvent *pEvent;
void CTestGraphtBuilderDlg::OnButton1()
{
CoInitialize(NULL);
// Create the filter graph manager and query for interfaces.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change string to a file on your system.
pGraph->RenderFile(L"F://meida//成全.DAT", NULL);
// Run the graph.
pMediaControl->Run();
// Wait for completion.
// long evCode;
// pEvent->WaitForCompletion(INFINITE, &evCode);
// Clean up.
}
void CTestGraphtBuilderDlg::OnButton2()
{
pMediaControl->Stop();
pMediaControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
被郁闷n久后解决了,是否还有其它问题待大家的反馈.
方法为: 将graph中的所有filter都断开,然后都RemoveFilter.
//主工程中
IBaseFilter* pHeadFilter = NULL;
pHeadFilter = mDXTool.GetHeadFilter(mpVideoGrabber); //取到初始端filter
mDXTool.NukeDownstream(pHeadFilter,mpGraphBuilder);// 从初始filter开始 全部干掉
SAFE_RELEASE(pHeadFilter);
功能函数:
#define BeginEnumPins(pBaseFilter, pEnumPins, pPin) /
{CComPtr<IEnumPins> pEnumPins; /
if(pBaseFilter && SUCCEEDED(pBaseFilter->EnumPins(&pEnumPins))) /
{ /
for(CComPtr<IPin> pPin; S_OK == pEnumPins->Next(1, &pPin, 0); pPin = NULL) /
{ /
#define EndEnumPins }}}
IBaseFilter * CDXTool::GetHeadFilter(IBaseFilter * inSrcFilter)
{
IBaseFilter * infilter = inSrcFilter;
IBaseFilter * UpFilter = NULL;
while(infilter)
{
UpFilter = GetUpFilter(infilter);
if(UpFilter == NULL)
{
return infilter;
}
FILTER_INFO fi;
USES_CONVERSION;
UpFilter->QueryFilterInfo(&fi);
char * pt = W2A(fi.achName);
SAFE_RELEASE(fi.pGraph);
if(infilter && (infilter!=inSrcFilter))
SAFE_RELEASE(infilter);
infilter = UpFilter;
}
SAFE_RELEASE(UpFilter);
return NULL;
}
void CDXTool::NukeDownstream(IBaseFilter* pBF, IFilterGraph* pFG)
{
if(!pBF) return;
BeginEnumPins(pBF, pEP, pPin)
{
CComPtr<IPin> pPinTo;
CPinInfo pi;
if(SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo
&& SUCCEEDED(pPinTo->QueryPinInfo(&pi)))
{
if(pi.dir == PINDIR_INPUT)
{
NukeDownstream(pi.pFilter, pFG);
pFG->Disconnect(pPinTo);
pFG->Disconnect(pPin);
pFG->RemoveFilter(pi.pFilter);
}
}
}
EndEnumPins
}
IBaseFilter* CDXTool::GetUpFilter(IBaseFilter * inSrcFilter)
{
IEnumPins * pinEnum = 0;
IBaseFilter * BaseFilter = NULL;
if (SUCCEEDED(inSrcFilter->EnumPins(&pinEnum)))
{
pinEnum->Reset();
IPin * pin = 0;
ULONG cFetched = 0;
int i = 0;
while (SUCCEEDED(pinEnum->Next(1, &pin, &cFetched)))
{
PIN_INFO pininfo = {0};
PIN_DIRECTION pinDir;
if(cFetched == 0)
break;
if(cFetched && pin)
{
i++;
pin->QueryDirection(&pinDir);
if(pinDir == PINDIR_INPUT)
{
IPin * connectedPin = 0;
if(SUCCEEDED(pin->ConnectedTo(&connectedPin)))
{
if(SUCCEEDED(connectedPin->QueryPinInfo(&pininfo)))
{
BaseFilter = pininfo.pFilter;
SAFE_RELEASE(connectedPin);
SAFE_RELEASE(pin);
break;
}
SAFE_RELEASE(pininfo.pFilter);
SAFE_RELEASE(connectedPin);
}
}
}
SAFE_RELEASE(pin);
}
SAFE_RELEASE(pinEnum);
}
return BaseFilter;
}
//注 部分函数来源自开源工程 mpc