directshow学习笔记四-----视频预览(将预览视频播放到指定picture控件中,个人学习所用,仅供参考)

接上一章,由于没搞明白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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//指定视频采集设备的友好名字,为它创建一个Filter IBaseFilter * CTestPreviewDlg::CreateVideoDevice(const char * inFriendlyName) { return CreateHardwareFilter(CLSID_VideoInputDeviceCategory,inFriendlyName); } //根据设备的友好名字,创建一个代表该设备的Filter IBaseFilter * CTestPreviewDlg::CreateHardwareFilter(GUID inCategory,const char * inFriendlyName) { //创建一个系统枚举组件对象 ICreateDevEnum * enumHardware = NULL; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL, IID_ICreateDevEnum,(void**)&enumHardware); if(FAILED(hr)) { return NULL; } IBaseFilter * hardwareFilter = NULL; IEnumMoniker * enumMoniker = NULL; //为指定的目录创建枚举器 hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0); if(enumMoniker) { enumMoniker->Reset(); ULONG fetched = 0; IMoniker * moniker = NULL; char friendlyName[256]; //枚举得到该目录下所有的设备,逐个进行名字匹配 while(!hardwareFilter && SUCCEEDED(enumMoniker->Next(1,&moniker, &fetched)) && fetched) { if(moniker) { IPropertyBag * propertyBag = NULL; VARIANT name; friendlyName[0] = 0; hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&propertyBag); //读取设备的友好名字 if(SUCCEEDED(hr)) { name.vt = VT_BSTR; hr = propertyBag->Read(L"Friendlyname",&name,NULL); } if(SUCCEEDED(hr)) { WideCharToMultiByte(CP_ACP,0,name.bstrVal,-1, friendlyName,256,NULL,NULL); //如果当前设备的友好名字与用户指定的设备名字相同, //则将当前设备标识绑定为Filter形式 if(strcmp(friendlyName,inFriendlyName) == 0) { moniker->BindToObject(0,0,IID_IBaseFilter, (void**)&hardwareFilter); } } //释放使用过的接口 if(propertyBag) { propertyBag->Release(); propertyBag = NULL; } moniker->Release(); } } enumMoniker->Release(); } enumHardware->Release(); return hardwareFilter; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值