以下为视频采集的主要代码(不全),不可直接编译。
完整代码见http://download.youkuaiyun.com/detail/u011073510/8319753
1:枚举设备(有些电脑连接了多个摄像头)
<pre name="code" class="cpp"> //创建COM对象实例
ICreateDevEnum *pCreateDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,
NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
(void**)&pCreateDevEnum);
//枚举每一个设备
IMoniker *pM; //用这来表示一个设备
while(hr = pEm->Next(1, &pM, &cFetched), hr == S_OK){} //枚举设备
2:选择一设备(从中选择一个摄像头)
//连接到指定序号的设备
pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter); //pFilter , IBaseFilter**类型 , pM(指定的IMoniker)
//添加IBaseFilter 到 IGraphBuilder
hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");
3:采集视频设置
//创建m_pGrabBase ,由ISampleGrabebr 类型的m_pGrabber 作为参数初始化
CComQIPtr<IBaseFilter, &IID_IBaseFilter> pGrabBase(m_pGrabber);
//添加pGrabBase到IGraphBuilder
hr = m_pGB->AddFilter(pGrabBase, L"Grabber");
//预览或采集视频 开始获取摄像头拍摄的信息
hr = m_pCapture->RenderStream(
&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
//设置回调对象,每次获取完摄像头像素信息后系统自动调用m_cb(CSampleCB类型)的成员函数 BufferCB(double , BYTE *pBuffer, long lBufferSize)
hr = m_pGrabber->SetCallback(&m_cb, 1);