没有合适的资源?快使用搜索试试~ 我知道了~
首页Windows视频采集与DirectShow技术详解
Windows视频采集与DirectShow技术详解
![](https://csdnimg.cn/release/wenkucmsfe/public/img/star.98a08eaa.png)
"《VC++视频技术方案宝典》深入探讨了视频采集在IT行业中的关键地位,特别是在视频监控系统开发中的作用。视频采集质量直接影响后续处理如预览、录像、回放和图像识别的性能。文章首先介绍了三种常见的视频采集方法:VFW(Video For Windows)、DirectShow和SDK。 VFW,作为早期的解决方案,由微软提供,其优点在于与Windows系统集成紧密,无需额外库文件即可运行,但因其对特定监控卡的支持不足,不适合专业级监控系统的开发。DirectShow则是一个更先进的流媒体开发包,支持多种媒体格式,适用于通用视频监控程序开发,特别适合WDM驱动的监控设备。 SDK,即软件开发包,由监控卡制造商提供,简化了视频监控系统的开发过程,允许开发者在无需深入了解复杂技术的情况下创建应用程序。然而,由于不同厂家的SDK不兼容,可能导致程序移植问题。 具体到VFW方案,它是基于Microsoft在1992年发布的数字视频软件包,适用于通用设备,主要通过AVICap.dll、MSVideo.dll等库文件提供视频和音频处理功能。开发流程涉及引用vfw32.lib库,这个库通常未默认包含在MFC工程中,需要开发者手动导入。开发人员需通过包含vfw.h头文件,调用库中封装的视频函数来实现VFW的视频采集。 综上,这本书提供了一个全面的指南,帮助读者理解和选择合适的视频采集技术,无论是初学者还是经验丰富的开发者,都能从中找到适合自己的解决方案,并提升视频处理应用的性能和兼容性。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/7004299/bg10.jpg)
16
图 2.8 视频录像设计方案
实例位置:光盘\mr\2\2.2\2.2.6\01
(1)创建一个基于对话框的工程,在对话框中添加按钮、图像控件,如图 2.9 所示。
图 2.9 对话框资源设计
(2)在对话框的头文件中引用“vfw.h”头文件,并导入“vfw32.lib”库文件。
#include "vfw.h"
#pragma comment (lib,"vfw32")
(3)向对话框类中添加成员变量。
DWORD m_Frame; //记录帧数
COMPVARS m_Com; //压缩参数
![](https://csdnimg.cn/release/download_crawler_static/7004299/bg11.jpg)
17
BITMAPINFO m_InInfo,m_OutInfo; //位图格式
PAVIFILE m_pFile; //AVI 文件
AVISTREAMINFO strhdr; //AVI 流信息
PAVISTREAM ps; //AVI 流指针
BOOL m_Captured; //是否开始捕捉
(4)定义一个回调函数,在流捕捉时执行。
LRESULT WINAPI EncodeCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
{
CVideoEncodeDlg* pDlg = (CVideoEncodeDlg*)AfxGetMainWnd();
if ((pDlg->m_Captured) && (lpVHdr->dwFlags&VHDR_DONE))
{
char* buffer = new char [lpVHdr->dwBytesUsed+1];
memset(buffer,0,lpVHdr->dwBytesUsed+1);
DWORD dwCkID ;
DWORD dwCompFlags ;
DWORD dwQuality = 100;
//视频压缩
if (ICCompress(pDlg->m_Com.hic, 0, &pDlg->m_OutInfo.bmiHeader, buffer,
&pDlg->m_InInfo.bmiHeader,
(unsigned char *)lpVHdr->lpData, &dwCkID, &dwCompFlags,
pDlg->m_Frame++,0, dwQuality, NULL, NULL) == ICERR_OK)
{
AVIStreamSetFormat(pDlg->ps,pDlg->m_Frame,&pDlg->m_OutInfo,
sizeof(pDlg->m_OutInfo));
AVIStreamWrite(pDlg->ps,pDlg->m_Frame ,1, (LPBYTE) buffer,
pDlg->m_OutInfo.bmiHeader.biSizeImage ,AVIIF_KEYFRAME,NULL,
NULL);
![](https://csdnimg.cn/release/download_crawler_static/7004299/bg12.jpg)
18
}
delete []buffer;
}
return 1;
}
(5)在对话框初始化时开始视频预览,设置视频参数。
m_Captured = FALSE;
m_hWndVideo = capCreateCaptureWindow(NULL,WS_POPUP,1,1,10,10,m_hWnd,0);
//连接驱动程序
if (capDriverConnect(m_hWndVideo,0))
{
::SetParent(m_hWndVideo,*this);
::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);
CRect wndRC;
m_Panel.GetClientRect(wndRC);
m_Panel.MapWindowPoints(this,wndRC);
wndRC.DeflateRect(1,1,1,1);
::SetWindowPos(m_hWndVideo,NULL,wndRC.left,wndRC.top,wndRC.Width(),
wndRC.Height(),SWP_NOZORDER);
::ShowWindow(m_hWndVideo,SW_SHOW);
CAPDRIVERCAPS caps;
capDriverGetCaps(m_hWndVideo,sizeof(caps),&caps);
if (caps.fHasOverlay)
capOverlay(m_hWndVideo,TRUE);
CAPTUREPARMS params;
capCaptureGetSetup(m_hWndVideo,¶ms,sizeof(params));
params.fYield = TRUE;
params.fAbortLeftMouse = FALSE;
![](https://csdnimg.cn/release/download_crawler_static/7004299/bg13.jpg)
19
params.fAbortRightMouse = FALSE;
params.fLimitEnabled = FALSE;
params.vKeyAbort = FALSE;
params.fCaptureAudio = FALSE;
capCaptureSetSetup(m_hWndVideo,¶ms,sizeof(params));
capSetCallbackOnVideoStream(m_hWndVideo,EncodeCallback);
capPreviewRate(m_hWndVideo,30);
capPreview(m_hWndVideo,TRUE);
}
(6)向对话框中添加 InitCompress 方法,设置压缩参数信息。
void CVideoEncodeDlg::InitCompress()
{
capGetVideoFormat(m_hWndVideo,&m_InInfo ,sizeof(BITMAPINFO));
capGetVideoFormat(m_hWndVideo,&m_OutInfo,sizeof(BITMAPINFO));
memset(&m_Com,0,sizeof(COMPVARS));
m_Com.cbSize=sizeof(m_Com);
//利用代码选择压缩器
m_Com.dwFlags=ICMF_COMPVARS_VALID;
m_Com.fccHandler=mmioFOURCC('x','v','i','d');
m_Com.fccType=ICTYPE_VIDEO;
m_Com.lFrame=0;
m_Com.lKey=15;
m_Com.lKeyCount=0;
m_Com.lDataRate = 780;
m_Com.lpbiOut=(BITMAPINFO*)&m_OutInfo;
m_Com.hic= ICOpen(ICTYPE_VIDEO,mmioFOURCC('x','v','i','d'),ICMODE_COMPRESS);
m_Com.cbState = 1180;
![](https://csdnimg.cn/release/download_crawler_static/7004299/bg14.jpg)
20
//利用对话框选择压缩器
// ICCompressorChoose(NULL,ICMF_CHOOSE_ALLCOMPRESSORS ,
(LPVOID)&m_InInfo,NULL,&m_Com,"选择压缩类型");
ICCompressGetFormat(m_Com.hic,&m_InInfo.bmiHeader,&m_OutInfo.bmiHeader);
//开始压缩
int ret = ICCompressBegin(m_Com.hic,(BITMAPINFO*)&m_InInfo,
(BITMAPINFO*)&m_OutInfo);
if (ret!=ICERR_OK )
MessageBox("压缩失败");
}
(7)处理“录像”按钮的单击事件,开始视频录像。
void CVideoEncodeDlg::OnOK()
{
CString filename;
CFileDialog FileDlg(FALSE,"avi");
if (FileDlg.DoModal()==IDOK)
{
filename = FileDlg.GetPathName();
capGetVideoFormat(m_hWndVideo,&m_InInfo,sizeof(m_InInfo));
m_Frame = 0 ;
//AVI 文件初始化
AVIFileInit() ;
//设置压缩参数
InitCompress();
//打开文件
AVIFileOpen(&m_pFile,filename,OF_WRITE | OF_CREATE,NULL);
memset(&strhdr, 0, sizeof(strhdr)) ;
strhdr.fccType = streamtypeVIDEO;
剩余368页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/0aa03b07cf4443b3b0b1a1b67ecb6b5b_justinhan001x.jpg!1)
justinhan001x
- 粉丝: 4
- 资源: 9
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- AirKiss技术详解:无线传递信息与智能家居连接
- Hibernate主键生成策略详解
- 操作系统实验:位示图法管理磁盘空闲空间
- JSON详解:数据交换的主流格式
- Win7安装Ubuntu双系统详细指南
- FPGA内部结构与工作原理探索
- 信用评分模型解析:WOE、IV与ROC
- 使用LVS+Keepalived构建高可用负载均衡集群
- 微信小程序驱动餐饮与服装业创新转型:便捷管理与低成本优势
- 机器学习入门指南:从基础到进阶
- 解决Win7 IIS配置错误500.22与0x80070032
- SQL-DFS:优化HDFS小文件存储的解决方案
- Hadoop、Hbase、Spark环境部署与主机配置详解
- Kisso:加密会话Cookie实现的单点登录SSO
- OpenCV读取与拼接多幅图像教程
- QT实战:轻松生成与解析JSON数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)