接上一章,由于没搞明白RenderStream(),QueryInterface()以及put_Owner()的顺序,所以没有将视频播放到指定picture控件中。
修改如下
void CTestWindowDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//在对话框初始化时枚举视频捕捉设备,设计过滤图表。
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//如何创建FilterGraph
//第一步:创建 ICaptureGraphBuilder2接口
CoCreateInstance(CLSID_CaptureGraphBuilder2,0,
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
//第二步:创建IGraphBuilder接口
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
//第三步:调用ICaptureBuilder的SetFilterGraph方法将FilterGraph加入到Builder中
pBuilder->SetFiltergraph(pGraph);
//查询各个接口,得到媒体控制接口,该接口控制整个Graph状态的
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);//查询接口
//自动选择第三个为当前工作的视频采集设备
if(m_combo.GetCount() > 0)
{
m_combo.SetCurSel(2);
CString deviceName;
m_combo.GetLBText(2,deviceName);
pSrc = CreateVideoDevice(deviceName);
}
pGraph->AddFilter(pSrc,L"avi");
pPreview = NULL;
CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,
IID_IBaseFilter,(void**)&pPreview);
if (pPreview != NULL)
{
pGraph->AddFilter(pPreview,L"preview");
//连接引脚
IPin * pSourceOut;
pSourceOut = FindPin(pSrc,PINDIR_OUTPUT);
IPin* pPreIn = FindPin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pSourceOut,pPreIn,NULL);
//获取预览窗口
//IVideoWindow * pVideoWindow= NULL;
pVideoWindow= NULL;
HRESULT hr = NULL;
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pSourceOut, NULL, NULL);
hr = pGraph->QueryInterface(IID_IVideoWindow,(void**)&pVideoWindow);
if (pVideoWindow)
{
IVideoWindow *pVidWin = NULL;
HWND hwndPreview = NULL;
RECT grc;
GetDlgItem( IDC_PREVIEW, &hwndPreview );
::GetClientRect(hwndPreview,&grc);
hr = pVideoWindow->put_Owner((OAHWND)hwndPreview);
hr = pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
hr = pVideoWindow->SetWindowPosition(0, 0, grc.right, grc.bottom);
}
pMediaControl->Run();
}
}
正在学习中。。。。
源码地址http://download.csdn.net/detail/afu1972715000/8343231