我最近要实现捕获QQ视频图像的功能,按照网上一些资料,写了一段代码,能运行的,但就是显示不了图像觉得代码上没什么明显的问题了,但就是没视频出来,月底前还要实现网络传输视频,压力大啊~ 我是这么做的:求指点错在哪~~1.枚举视频输入设备,创建视频输入Filter *pSrc
2.创建FilterGraph、CaptureGraphBuilder2
3.pGraph->AddFilter(pSrc,L"avi");
4.添加视频预览窗口Filter *pPreview
pGraph->AddFilter(pPreview,L"preview");
5.连接 *pSrc 和 *pPreview
6.运行pMediaControl->Run();代码如下: HRESULT hr =CoInitialize(NULL);
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
hr =CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);
if (hr != NOERROR)
return;
IEnumMoniker *pClassEnum = NULL;
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if (hr != NOERROR)
return;
ULONG cFetched;
if(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);//赋值
pMoniker->Release();
}
pClassEnum->Release();
//以上枚举设备结束,下面创建Graph
CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
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 * pViewWnd= NULL;
pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
if (pViewWnd)
{
//设置预览窗口的拥有者
HWND hWnd = m_view.GetSafeHwnd();//(图片框)播放窗口句柄
pViewWnd->put_Owner((long)hWnd);
// pViewWnd->put_Owner((long)m_hWnd);
pViewWnd->put_Left(1);
pViewWnd->put_Top(1);
//获取预览窗口风格
long style;
pViewWnd->get_WindowStyle(&style);
style = style & ~WS_CAPTION;
style = style & ~WS_DLGFRAME;
style = style & WS_CHILD;
pViewWnd->put_WindowStyle(style);
//设置预览窗口宽度和高度
CRect rc;
GetClientRect(rc);
pViewWnd->put_Height(200);
pViewWnd->put_Width(200);
}
pMediaControl->Run();
}
2.创建FilterGraph、CaptureGraphBuilder2
3.pGraph->AddFilter(pSrc,L"avi");
4.添加视频预览窗口Filter *pPreview
pGraph->AddFilter(pPreview,L"preview");
5.连接 *pSrc 和 *pPreview
6.运行pMediaControl->Run();代码如下: HRESULT hr =CoInitialize(NULL);
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
hr =CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);
if (hr != NOERROR)
return;
IEnumMoniker *pClassEnum = NULL;
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if (hr != NOERROR)
return;
ULONG cFetched;
if(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);//赋值
pMoniker->Release();
}
pClassEnum->Release();
//以上枚举设备结束,下面创建Graph
CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
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 * pViewWnd= NULL;
pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
if (pViewWnd)
{
//设置预览窗口的拥有者
HWND hWnd = m_view.GetSafeHwnd();//(图片框)播放窗口句柄
pViewWnd->put_Owner((long)hWnd);
// pViewWnd->put_Owner((long)m_hWnd);
pViewWnd->put_Left(1);
pViewWnd->put_Top(1);
//获取预览窗口风格
long style;
pViewWnd->get_WindowStyle(&style);
style = style & ~WS_CAPTION;
style = style & ~WS_DLGFRAME;
style = style & WS_CHILD;
pViewWnd->put_WindowStyle(style);
//设置预览窗口宽度和高度
CRect rc;
GetClientRect(rc);
pViewWnd->put_Height(200);
pViewWnd->put_Width(200);
}
pMediaControl->Run();
}
我再开请教网络传输视频的帖子,有兴趣的去那看看。还是要请大家多多指点下啊~