LRESULT CALLBACK VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
static int counter = 0;
char str[]="a.bmp";
str[0] = counter + '0';
counter++;
counter = counter % 10;//预留保存10张图片
capFileSaveDIB(hWnd,str);
return 0;
}
void CVFMDlg::OnBtnStart()
{
// TODO: Add your control notification handler code here
m_hCaptureWnd = capCreateCaptureWindow(NULL,WS_CHILD | WS_VISIBLE,1,1,10,10,m_hWnd,0);
capSetCallbackOnFrame(m_hCaptureWnd,VideoCallbackProc);
//capSetCallbackOnVideoStream(m_hCaptureWnd,&capVideoStreamCallback);
//capSetCallbackOnVideoStream意思是说当采集视频发生的时候,每采集一桢之后都会调用capVideoStreamCallback函数
if(m_hCaptureWnd == NULL)
{
MessageBox("创建显示窗口失败");
return;
}
//连接驱动程序
if (capDriverConnect(m_hCaptureWnd,0))
{
::SetParent(m_hCaptureWnd,*this);
::SetWindowLong(m_hCaptureWnd,GWL_STYLE,WS_CHILD);
//把采集窗口置于Static控件内
CRect wndRC;
m_panel.GetClientRect(wndRC);
m_panel.MapWindowPoints(this,wndRC);
wndRC.DeflateRect(1,1,1,1);
::SetWindowPos(m_hCaptureWnd,NULL,wndRC.left,wndRC.top,wndRC.Width(),wndRC.Height(),SWP_NOZORDER);
::ShowWindow(m_hCaptureWnd,SW_SHOW);
//设置捕捉源对话框
CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(m_hCaptureWnd,&CapDrvCaps,sizeof(CAPDRIVERCAPS));
if(CapDrvCaps.fHasDlgVideoSource) //设置捕捉源对话框
capDlgVideoSource(m_hCaptureWnd);
else
return;
//视频采集
capDlgVideoFormat(m_hCaptureWnd); //设置视频格式
capPreviewRate(m_hCaptureWnd,30); //每30秒监视一次
capPreview(m_hCaptureWnd,TRUE); //开始监视
}
else
{
MessageBox("连接失败!");
return ;
}
}
void CVFMDlg::OnBtnStop()
{
// TODO: Add your control notification handler code here
capCaptureStop(m_hCaptureWnd);
capPreview(m_hCaptureWnd, FALSE);
CWnd* pWnd=CWnd::FromHandle(m_hCaptureWnd);
pWnd->SendMessage(WM_CAP_DRIVER_DISCONNECT,0, 0L);
}
其余代码看看吧,没什么意义。
然后用MCI实现播放和录音,现在可以播放了,33行代码……
录音放到明天,太晚了,不录了。