目前的流媒体视频信号采集大多采用的是软压缩方式,所以对软件的要求是非常高的,而流媒体视频软件开发大多采用的是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 。