用VFW开发视频采集软件知识介绍

深圳九视电子科技有限公司
在线咨询
  • 首页
  • 视频采集卡
  • 视频录制盒
  • 视频转换器
  • 画面处理器
  • 解决方案
  • 服务中心
  • 关于九视电子
  • 联系我们
  • 服务政策
  • 九视电子学院
  • 咨询与报修
  • 常见问题解答
  • 相关下载
  • 新闻中心
 
销售热线:400-061-8657   > 服务中心 > 新闻中心 >




九视电子


新闻中心

用VFW开发视频采集软件知识介绍

九视电子

2011-12-23 14:43 作者:九视电子 出处:www.360tsw.com

  目前的流媒体视频信号采集大多采用的是软压缩方式,所以对软件的要求是非常高的,而流媒体视频软件开发大多采用的是DirectShow标准开发,因为现在市面上绝大多数视频采集卡其都能直接兼容DirectShow标准开发的软件。下面我们来介绍的是VFW开发视频采集软件的方法。

  VFW是Video For Windows的缩写,使用VFW可以快速开发Windows视频采集软件。VFW开发的资源可以参考MSDN中的Video Capture一节的内容,当然也可以参考网上一些翻译的不错的译文。

  VFW为开发人员提供了很多的接口,开发人员可以使用这些接口在视频采集过程中抓取图片、在采集窗口中预览采集的视频、设置采集参数及显示视频源、视频格式、压缩格式的设置对话框。

  开发VFW应用程序,首先要在头文件中包含Vfw.h头文件,编译时还要连接Vfw32.lib。

  开发VFW视频采集软件,一般的开发步骤如下:

  创建视频采集窗口

  关联采集窗口与采集驱动程序

  设置采集参数

  响应用户的操作,开始/结束视频采集

  创建视频窗口

  视频窗口与视频采集的驱动程序关联,它接收各种视频采集相关的消息,并根据这些消息控制视频采集设备的各种操作。后续的所有视频采集消息全部发送给视频采集窗口。要创建视频采集窗口可以通过调用capCreateCaptureWindow函数实现。

  我们可以通过在MFC的View类中增加一个窗口句柄成员变量来保存capCreateCaptureWindow函数返回的采集窗口句柄,然后在View类的OnCreate函数中添加以下语句。

  m_caphwnd = capCreateCaptureWindow(_T("My Capture Window"),WS_CHILD | WS_VISIBLE,0,0,500,600,this->GetSafeHwnd(),1);

  连接采集驱动

  创建采集窗口后,需要将采集窗口与采集驱动程序关联起来。

  为了验证当前PC机上是否安装的视频采集设备,可以在关联驱动程序之前调用capGetDriverDescription函数枚举一下系统中的采集驱动,参考代码如下:

  int i = 0;

  wchar_t sdriver[50];//驱动信息

  wchar_t sver[50];//版本信息

  CString m_driverInfo("");

  for ( i = 0; i < 10; i++ ) {

  if ( capGetDriverDescription(i,sdriver,50,sver,50) ) {

  m_driverInfo += sdriver;

  m_driverInfo += "/n";

  m_driverInfo += sver;

  m_driverInfo += "/n";

  memset(sdriver,0,50 * sizeof(wchar_t));

  memset(sver,0,50 * sizeof(wchar_t));

  }

  }

  if ( !m_driverInfo.IsEmpty() ) {

  //显示驱动程序信息

  AfxMessageBox(m_driverInfo);

  } else {

  AfxMessageBox(_T("No Capture!"));

  }

  确认当前系统中安装有采集设备后,可以使用capDriverConnect宏向视频采集窗口发送连接采集驱动的消息,参考代码如下:

  //关联第一个驱动

  capDriverConnect(m_caphwnd,0);

  设置采集参数

  在视频采集之前,可以通过capCaptureGetSetup宏取得视频采集参数,然后通过capCaptureSetSetup宏将新设定的采集参数传递到采集窗口,由采集窗口控制采集驱动程序。参考代码如下:

  CAPTUREPARMS s;

  capCaptureGetSetup(m_caphwnd,&s,sizeof(CAPTUREPARMS));//取得采集参数

  s.dwRequestMicroSecPerFrame = 33333;//采集一帧花费1/30秒

  s.fAbortLeftMouse = FALSE;//压下鼠标左键不终止采集

  s.fAbortRightMouse = FALSE;//压下鼠标右键不终止采集

  s.fCaptureAudio = TRUE;//c采集音频

  s.fYield = TRUE;//使用一个独立的线程来采集视频,不使用View窗口线程

  capCaptureSetSetup(m_caphwnd,&s,sizeof(CAPTUREPARMS));//设定采集参数

  还可以通过capGetVideoFormat宏取得视频格式,然后通过capSetVideoFormat设定视频格式。参考代码如下:

  LPBITMAPINFO bitmapinfo;

  DWORD bit_info_size = 0;

  //取得视频格式信息的大小

  bit_info_size = capGetVideoFormatSize(m_caphwnd);

  bitmapinfo = (LPBITMAPINFO)GlobalAlloc(GHND,bit_info_size);

  //取得视频格式信息

  capGetVideoFormat(m_caphwnd,bitmapinfo,bit_info_size);

  //设置视频格式信息

  bitmapinfo->bmiHeader.biCompression = BI_RLE4;//设置压缩格式为JPEG

  bitmapinfo->bmiHeader.biWidth = 640;//设置解压缩后的水平像素为640

  bitmapinfo->bmiHeader.biHeight = 480;//设置解压缩后的垂直像素为480

  //设置视频格式

  capSetVideoFormat(m_caphwnd,bitmapinfo,bit_info_size);

  注意,如果驱动程序不支持以上参数,以上设定是无效的,驱动程序还是使用默认的设置参数。

  开始/结束视频采集

  我们可以在菜单中添加一个视频采集开始的菜单项,在此菜单项的响应函数中使用capCaptureSequence宏开始视频采集。

  capCaptureSequence(m_caphwnd);

  同样,我们也可以添加视频结束的菜单项,在此菜单项的响应函数中使用capCaptureStop宏终止采集操作,然后使用capFileSaveAs宏将采集的视频保存到指定的文件中,如果不指定文件,默认保存到C盘CAPTURE.AVI文件中。

  capCaptureStop(m_caphwnd);

  capFileSaveAs(m_caphwnd,_T("cap.avi"));

  我们也可以在采集窗口中预览采集的视频,预览终止后,视频并不保存到文件中。预览的参考代码如下:

  //开始预览

  capPreview(m_caphwnd,TRUE);

  //结束预览

  capPreview(m_caphwnd,FALSE);

  图片抓取

  我们可以使用capGrabFrameNoStop宏抓取图片,然后使用capFileSaveDIB宏将采集的图片保存为DIB文件,因为DIB文件的大小比JPEG或PNG文件大很多,我们可以使用CImage类将DIB文件转换成JPEG文件或PNG文件。参考代码如下:

  CFileDialog fileopen(FALSE,_T("DIB"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.dib|*.dib|*.jpeg|*.jpeg|*.PNG|*.png|"));

  if ( IDOK == fileopen.DoModal() ) {

  CString path("");

  CString ext("");

  path = fileopen.GetPathName();

  ext = fileopen.GetFileExt();

  capGrabFrameNoStop(m_caphwnd);

  capFileSaveDIB(m_caphwnd,path.GetString());

  if ( ext != CString("DIB") && ext != CString("dib") ) {

  CImage myImage;

  myImage.Load(path.GetString());

  myImage.Save(path.GetString());

  }

  }

  显示视频源对话框

  可以使用capDlgVideoSource宏显示视频源对话框。视频源对话框可以设置视频源设备的一些设置,视频源对话框一般是下面的样子,但设备不同,对话框显示的内容肯能会有所不同。显示视频源对话框的参考代码如下:

  capDlgVideoSource(m_caphwnd);

  显示视频格式对话框

  可以使用capDlgVideoFormat宏显示视频格式设定对话框。这个对话框可以设定采集视频的格式。参考代码如下:

  capDlgVideoFormat(m_caphwnd);

  显示压缩设定窗口

  可以通过capDlgVideoCompression宏显示压缩设定窗口。通过这个窗口可以设定视频的压缩格式。参考代码如下:

  capDlgVideoCompression(m_caphwnd);

  九视电子是国内知名的视频采集卡研发和生产企业,多年来一直专注于技术的研发和开拓,从最初的1394采集卡开发到目前的高清音视频采集卡研发,一直走在了国内视频采集行业的前列,如2011年推出了数字DVI采集卡、高清HDMI音视频采集卡、高清VGA采集卡、双路高清视频采集卡等,其都能完美兼容各种视频采集软件,并且带有二次开发包SDK。了解更多九视电子视频采集卡您可以登录九视电子官网:http://www.360tsw.com 。 


          
联系我们 | 人才招聘 | 相关法律 | 网站导航   |  热线:400-061-8657