int CCamEXDlgDlg::PLAY(int wX, int wY,int wWidth,int wHeight)
{
HRESULT hr,hr1;
// 创建IGraphBuilder接口
hr1=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB);
// 创建ICaptureGraphBuilder2接口
hr1 = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **) &m_pCapture);
if (FAILED(hr1))
return 1;
m_pCapture->SetFiltergraph(m_pGB);
hr1 = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC);
if (FAILED(hr1))
return 1;
hr1 = m_pGB->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVW);
if (FAILED(hr1))
return 1;
if(!BindFilter(0, &m_pBF))
return 1;
hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");
// create a sample grabber
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabber )
{
return 1;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
//设置视频格式
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
if( FAILED( hr ) )
{
return 1;
}
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
if( FAILED( hr ) )
{
return 1;
}
// try to render preview/capture pin
hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ) )
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ) )
{
// AfxMessageBox("Can’t build the graph");
return 1;
}
hr = m_pGrabber->GetConnectedMediaType( &mt );
if ( FAILED( hr) )
{
return 1;
}
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
hr = m_pGrabber->SetBufferSamples( false );
hr = m_pGrabber->SetOneShot( false );
hr = m_pGrabber->SetCallback( &mCB, 1 );
//设置视频捕捉窗口
hr = m_pVW->put_Owner((OAHWND)m_hWnd);
MoveWindow(wX,wY,wWidth, wHeight);
if (FAILED(hr))return 1;
hr = m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
if (FAILED(hr))return 1;
if (m_pVW)
{
m_pVW->SetWindowPosition(0, 0, wWidth,wHeight);
}
hr = m_pVW->put_Visible(OATRUE);
hr = m_pMC->Run();//开始视频捕捉
return 0;
}
在你的代码中,可能是由于没有正确设置摄像头的 ID 或者选择了错误的摄像头导致了问题。在 DirectShow 中,可以通过设置 Capture Filter 的参数来选择摄像头。