基于VFW实现摄像头录制并保存视频文件

本文介绍了通过使用Windows提供的VFW(Microsoft Video for Windows)实现摄像头的开启和视频文件的保存。

主要接口函数介绍

1.capCreateCaptureWindow函数:创建一个捕获窗口。

函数声明

HWND VFWAPI capCreateCaptureWindow(LPCTSTR lpszWindowName, DWORD wStyle, int x, int y, int nWidth, int nHeight, HWND hWnd, int nID);

参数

  • lpszWindowName
    用于捕获窗口的名称的字符串。
  • dwStyle
    用于捕获窗口的窗口样式。 使用CreateWindowEx函数描述窗口样式。
  • x
    捕获窗口左上角的x坐标。
  • y
    捕获窗口左上角的y坐标。
  • nWidth
    捕获窗口的宽度。
  • nHeight参数
    捕获窗口的高度。
  • hWnd
    父窗口句柄。
  • nID
    窗口标识符。
  • 返回值
    如果成功则返回捕获窗口的句柄,否则返回NULL。

2.capDriverConnect函数: 将捕获窗口连接到捕获驱动程序。 您可以使用此宏或显式发送WM_CAP_DRIVER_CONNECT消息。

函数声明

BOOL capDriverConnect(hwnd, i);

参数

  • hwnd
    捕获窗口的句柄。
  • i
    捕获驱动程序的索引,索引范围为0到9。
  • 返回值
    如果成功则返回TRUE,如果无法连接到指定捕获窗口,则返回FALSE。

备注:将捕获驱动程序连接到捕获窗口将自动断开任何以前连接的捕获驱动程序。

3.capDriverGetCaps函数:返回当前连接到捕获窗口的捕获驱动程序的硬件功能。

函数声明

BOOL capDriverGetCaps(hwnd, s, wSize);

参数

  • hwnd
    捕获窗口的句柄。
  • s
    指向CAPDRIVERCAPS结构以包含硬件功能。
  • wSize
    由s引用的结构的大小(以字节为单位)。
  • 返回值
    如果成功则返回TRUE,如果捕获窗口未连接到捕获驱动程序,则返回FALSE。
  • 备注
    CAPDRIVERCAPS中返回的功能对于给定的捕获驱动程序是不变的。 当捕获驱动程序首次连接到捕获窗口时,应用程序需要检索该信息。

4.capPreviewRate函数: 在预览模式下设置帧显示速率。

函数声明

BOOL capPreviewRate(hwnd, wMS);

参数

  • hwnd
    捕获窗口的句柄。
  • wMS
    以毫秒为单位,捕获和显示新帧的速率。
  • 返回值
    如果成功则返回TRUE,如果捕获窗口未连接到捕获驱动程序,则返回FALSE。
  • 备注
    预览模式使用大量的CPU资源。 当另一个应用程序关注时,应用程序可以禁用预览或降低预览速率。 在流视频捕获期间,预览任务比将帧写入磁盘的优先级低,只有在没有其他缓冲区可用于写入时才会显示预览帧。

5.capPreview函数: 启用或禁用预览模式。 在预览模式下,帧从捕获硬件传输到系统存储器,然后使用GDI功能显示在捕获窗口中。

函数声明

BOOL capPreview( hwnd, f);

参数

  • hwnd
    捕获窗口的句柄。
  • f
    预览标志。 为此参数指定TRUE以启用预览模式或FALSE禁用它。
  • 返回值
    如果成功返回TRUE,否则返回FALSE。
  • 备注
    预览模式使用大量的CPU资源。 当另一个应用程序关注时,应用程序可以禁用预览或降低预览速率。 CAPSTATUS结构的fLiveWindow成员指示是否启用预览模式。启用预览模式会自动禁用重叠模式。

主要代码实现

1.初始化中列举安装的捕获驱动程序,设置驱动程序

使用capGetDriverDescription 函数来获得系统已经安装的所有捕获驱动程序的名称和版本。

 char szDeviceName[80];char szDeviceVersion[80];for (int wIndex = 0; wIndex < 10; wIndex++){if (capGetDriverDescription(wIndex, szDeviceName, sizeof(szDeviceName), szDeviceVersion, sizeof(szDeviceVersion))){m_ctrlDevice.AddString(szDeviceName);}}if (m_ctrlDevice.GetCount() > 0){m_ctrlDevice.SetCurSel(0);//默认选择第一个}     else{MessageBox("No video software", "No", MB_OK);}

2.开启视频预览窗口

void CTestCamDlg::OnBnClickedBtnPreview()
{// TODO: 在此添加控件通知处理程序代码// 获取窗口的大小BOOL bRet = FALSE;RECT rcDisplay = { 0 };::GetWindowRect(m_ctrlLiveVideo.m_hWnd, &rcDisplay);//创建预览窗口hWndC = capCreateCaptureWindow("Capture Window", WS_CHILD | WS_VISIBLE,4, 4, (rcDisplay.right - rcDisplay.left), (rcDisplay.bottom - rcDisplay.top),m_hWnd, IDC_LIVE_DISPLAY);if (NULL == hWndC){MessageBox("capCreateCaptureWindow failed!");return;}// 连接第0号驱动器// capDriverConnect有时会调用失败, 所以需要使用一个循环来知道调用成功为止do{bRet = capDriverConnect(hWndC, 0);} while (FALSE == bRet);//得到驱动器的性能bRet = capDriverGetCaps(hWndC, &CapDrvCaps, sizeof(CAPDRIVERCAPS));if (FALSE == bRet){MessageBox("capDriverGetCaps failed!");return;}// 判断是否初始化成功if (FALSE == CapDrvCaps.fCaptureInitialized){MessageBox("Video Capture Init");return;}capPreviewScale(hWndC, TRUE);capPreviewRate(hWndC, 30);//设置帧率capPreview(hWndC, TRUE);//设置预览方式m_ctrlDevice.SetCurSel(0);Invalidate(FALSE);GetDlgItem(IDC_BTN_PREVIEW)->EnableWindow(FALSE);//第一次正确启动后不可再次点击SetTimer(1, 0, NULL);//设置定时器
}

3.开始录制/结束录制

void CTestCamDlg::OnBnClickedBtnCaptrue()
{// TODO: 在此添加控件通知处理程序代码CFileDialog fileDlg(FALSE, _T(".avi"), "*.avi", OFN_OVERWRITEPROMPT, "Video File(*.avi)|*.avi||", this);CString szBtnName = "Capture";GetDlgItem(IDC_BTN_CAPTRUE)->GetWindowText(szBtnName);if ("Capture" == szBtnName){if (fileDlg.DoModal() == IDOK){GetDlgItem(IDC_BTN_CAPTRUE)->SetWindowText("Stop");capCaptureSequence(hWndC);capFileSaveAs(hWndC, (LPTSTR)fileDlg.GetFileName().GetBuffer());}return;}capCaptureStop(hWndC);GetDlgItem(IDC_BTN_CAPTRUE)->SetWindowText("Capture");
}

4.图像中心绘制十字丝和图像上显示实时系统时间

void CTestCamDlg::DrawCross()
{CWnd* pPictureWnd = GetDlgItem(IDC_LIVE_DISPLAY);CDC* pdc = pPictureWnd->GetDC();CPen *pPenBlue = new CPen(); //创建画笔对象pPenBlue->CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); //redCGdiObject *pOldPen = pdc->SelectObject(pPenBlue);pdc->SelectObject(pPenBlue);CRect rect;GetDlgItem(IDC_LIVE_DISPLAY)->GetWindowRect(&rect);//获取控件的屏幕坐标ScreenToClient(&rect);//转换为对话框上的客户坐标//绘制十字丝pdc->MoveTo((rect.left + rect.right) / 2, (rect.bottom + rect.top) / 2 - 40);pdc->LineTo((rect.left + rect.right) / 2, (rect.bottom + rect.top) / 2 + 40);pdc->MoveTo((rect.left + rect.right) / 2 - 40, (rect.bottom + rect.top) / 2);pdc->LineTo((rect.left + rect.right) / 2 + 40, (rect.bottom + rect.top) / 2);//显示系统时间:21年01月05日 16:00:00CString strTime;CTime tm;tm = CTime::GetCurrentTime();             //获取当前系统时间strTime = tm.Format("%y年%m月%d日 %X");   //格式化系统时间。即使系统时 间按照Format中设置的格式显示pdc->TextOutA(rect.right - 200, rect.top, strTime);delete pPenBlue;pPictureWnd->ReleaseDC(pdc);
}

5.程序运行效果显示

6.代码

https://download.csdn.net/download/CXYLVCHF/14028505

基于VFW实现摄像头录制并保存视频文件相关推荐

  1. opencv-python——调用摄像头录制并保存视频

    调用摄像头录制并保存视频 import numpy as np import cv2cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc( ...

  2. python3 + opencv 调用摄像头录像后保存视频

    python3 + opencv 调用摄像头录像后保存视频 #!/usr/bin/python3 import cv2## opening videocapture cap = cv2.VideoCa ...

  3. python调用手机摄像头,并保存视频

    python调用手机摄像头,并保存视频 说明:手机端安装IP摄像头APP,并开启 代码如下: # -*- coding: utf-8 -*- """ Created on ...

  4. 保存视频文件到相册视频的时长为0

    问题:保存视频文件到相册视频的时长为0: 代码: String fileName = FileManagerUtil.getFileName(filePath); String mimeType =  ...

  5. 录制好的视频文件,如何添加到直播源中做成直播?

    [ 阿酷原创  2017-11-27 长沙 ] 录制好的视频文件,如何添加到直播源中做成直播? 打开直播助手界面,点击"添加素材",就可以添加音视频文件了,选择你要添加的视频文件, ...

  6. OpenCV API使用笔记 —— 4. 如何保存视频文件

    文章目录 写入图片帧信息 C/CPP示例 Python示例 在<OpenCV API使用笔记 -- 1. 如何打开摄像头或视频文件> 介绍过使用「VideoCapture」类,可以打开摄像 ...

  7. python读视频文件_python读取和保存视频文件

    如何用python实现视频关键帧提取并保存为图片?也许你会觉得对小编多做一点事你会觉得你很爽,可是在小编看来这是不屑的 import cv2vc = cv2.VideoCapture('Test.av ...

  8. python读取视频显示视频和保存视频文件

    为了获取视频,应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件.设备索引号就是在指定要使用的摄像头. 一般的笔记本电脑都有内置摄像头.所以参数就是 0.你可 ...

  9. iOS开发 Tips 保存视频文件到相册

    需要遵守这个代理 UIImagePickerControllerDelegate // path 为视频的绝对路径 /var/mobile/Containers/Data/Application/XX ...

最新文章

  1. 面试官问:如果MySQL的自增 ID 用完了,怎么办?
  2. LeetCode 421. 数组中两个数的最大异或值
  3. [Matlab] 画图命令
  4. ubuntu 12.04 nginx+ mono-fastcgi-server
  5. Kotlin 1.2 新特性
  6. 深度学习笔记(36) 边界框预测
  7. 重装ubuntu系统后VS Code远程连接失败
  8. uV胶点胶机器人_解析手机用粘合剂十大用胶点
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_2_练习_使用递归计算1-n之间的和...
  10. Linux镜像克隆网卡流量
  11. 访问网址(使用CDN)时 智能DNS调度 与 用户定位调度(根据IP定位)
  12. 电子签批板那个品牌好用?国产柜台电子签名板推荐
  13. python 抓取微博评论破亿_利用python实现爬取微博评论的方法
  14. java判断字符串是否是空,java判断字符串是否为空的方法
  15. Windows和Linux下搭建J2sdk的环境
  16. 微型计算机8086工作原理,8086到80486微型计算机系统原理与接口
  17. 在html中在tools作用,图层蒙版的作用是什么
  18. infor wms 中英文对照_视听盛宴 I纸牌屋揭露美国政治权力运作(16中英、纯英、无字幕可切换视频+中英文全剧本+全季音频)...
  19. 数据中台:建立在数据网络效应之上的赛道
  20. 【LSTM分类】基于双向长短时记忆(BiLSTM)实现数据分类含Matlab源码

热门文章

  1. win10下载mysql MSI_Windows10 MYSQL Installer 安装 (msi 安装)
  2. idea java 代码混淆加密_IDEA加密算法
  3. 昆仑通态MCGS与3台西门子V20变频器通讯程序 3台变频器通讯
  4. 2022年监理工程师基本理论与相关法规考试每日一练及答案
  5. 2016职称计算机模拟考试,最新2016年职称计算机考试模拟题
  6. Google 13周年纪 – Google 11年收购历程
  7. ORA-01113,ORA-01110的简单解决
  8. python 五子棋单机个人版-pygame
  9. 智能搜索引擎 | 驱动电商业务增长实践
  10. solidworks调用toolbox出现未配置怎么办