VFW (video for windows)视频编程
2008-04-26 14:00
A VICap提供视频流的捕捉,并且可以是实时的单帧捕捉。另外,A VICap提供视频资源——媒体控制接口(Media Control Interface)设备的控制,因此我们可以控制(当然是通过我们的应用程序了)视频资源(张坤注:应该是MCI ,Media Control Interface)的起、停位置,并且可以增加捕捉操作来加入帧捕捉的步骤!
你用A VICap window class创建的窗口,可以完成一下操作(张坤注:或者说是“有一下功能”):
1.捕捉声音、视频流到一个A VI文件。
2.动态地连接视频、声音输入设备。
3.可以用覆盖,或者直接用preview
去显示一个实时变化的视频信号。
4.当开始捕捉的时候,指定一个文件(张坤注:用来存储捕捉到的视频的文件),并且把扑捉到的内容copy到另外一个文件。
5.设置捕捉的频率;
6.显示对话框来控制视频资源(张坤注:应该是MCI吧)和格式。
7.创建、保存、加载调色板。
8.Copy图片,调色板到剪贴板上。
9.捕捉、保存一个单独的图片为一个设备无关的bitmap
如何使用视频捕捉
相信你看完上面的翻译已经快要呕吐了——这么菜的水平还要上来丢人现眼……
没办法,谁然我这人脸皮厚呢——再说了,这年头脸皮厚吃香啊^_^——比如说那个叫做什么姐姐的啦,我的脸皮厚还是跟她学的呢。算了算了不多说了,只要你敢往下看,我就敢往下写——与其叫“写”还不如叫翻译吧。
这部分包含了一些如何使用A VICap window class进行视、音频捕捉的步骤和例子
1.创建一个视频捕捉窗口。
下面的例子用capCreateCaptureWindow函数创建了一个捕捉窗口;
HWND hWndc=capCreateCaptureWindow(
(LPSTR)”My Capture Window”,//窗口名称
WS_CHILD | WS_VISIBLE,//设置窗口的类型
0,//窗口左上角横坐标
0,//窗口左上角纵坐标
100,//窗口宽度
100,//窗口高度
(HWND)hwndParent, //父窗口句柄
(int)nID /*该窗口的id*/)
2.连接视频捕捉设备驱动
下面的例子连接捕捉窗口和MSVIDEO设备驱动,然后用capDriverDisconnect宏断开。fOK=SendMessage(hWndc, //接收消息的窗口句柄
WM_CAP_DRIVER_CONNECT, //发送的消息
0, //消息附加参数
0L/*消息附加参数*/);
或者也可以用一个宏去连接MSVEDEO驱动
fOK=capDriverConnect(hWndC,0);//其中的参数hWndC是我们刚才创建的视频捕捉
//窗口的句柄
然后再调用capDriverDisconnect宏断开视频捕捉驱动(这个步骤一般在捕捉完毕后) capDriverDisconnect(hWndC);
3.下面的例子用capGetDriverDescription函数去获取机器上安装的捕捉驱动的名字和版
本
char szDeviceName[80];//用来存放设备名称
char szDeviceVersion[80];//用来存放驱动版本
for(wIndex=0;wIndex<10;wIndex++)
{
if(capGetDriverDescription(wIndex,szDeviceName,sizeof(szDeviceName), szDeviceVersVersion,sizeof(szDeviceVersion))
{
//把驱动的名字添加到一个list里面,来供使用者选取;
}
}
3.获取视频捕捉驱动的能力(张坤注:或者说是功能吧)
WM_CAP_DRIVER_GET_CAPS消息返回捕捉驱动的能力和并把这些结果放入一个CAPDRIVERCAPS结构体变量中,应用程序每一次连接一个新的捕捉驱动到捕捉窗口,并且回更新CAPDRIVERCAPS结构体变量。下面的例子用capDriverGetCap宏去获取捕捉驱动的功能。
CAPDRIVERCAPS CapDrvCaps;
SendMessage(hWndc,WM_CAP_DRIVER_GET_CAPS,
Sizeof(CAPDRIVERCAPS),(LONG)(LPVOID)&CapDrvCaps);
上面用的是消息发送的形式,下面是用capDriverGetCaps宏的方式来获取: capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS));
4.获取视频扑捉窗口的状态
下面用capGetStatus宏获取视频流的最大尺寸,然后用这个尺寸做为SetWindowPos函数的参数去设置捕捉窗口的尺寸)
CAPSTATUS CapStatus;
capGetStatus(hWndC,&CapStatus,sizof(CAPSTATUS));
SetWindowPos(hWndC,NULL,0,0,CapStatus.uiImageWidth,CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
5.显示视频属性设置对话框
每种视频捕捉驱动都能提供三个不同的对话框用来控制视频数字化
面和捕捉进程,下面的例子向你展示如何显示这些对话框,在显示每个对话框之前,调用capDriverGetCaps宏并且核对返回的CAPDRIVERCAPS结构体变量,看该视频捕捉驱动是否能显示这些对话框。CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS));
//显示视频资源对话框
If(CapDrvCaps.fHasDlgVideoSource)
capDlgViceoSource(hWndC);
//显示视频格式对话框
If(CapDrvCaps.fHasDlgVideoFormat)
{
capDlgVideoFormat(hWndC);
}
if(CapDrvCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(hWndC);
6.获取、设置视频格式
BITMAPINFO结构体的长度是可变的,因此适应标准或压缩的数据格式。
由于这个结构体的长度是可变的,因此应用程序在获取当前视频格式之前必须经常检查结构体的长度,分配内存块。下面的例子用capGetVideoFormatSize宏来获取缓冲区的长度,然后调用capGetVideoFormat宏来获取当前的视频格式。
LPBITMAPINFO lpbi;
DWORD dwSize;
dwSize=capGetVideoFormatSize(hWndC);
lpbi=GlobalAllocPtr(GHND,dwSize);
capGetVideoFormat(hWndC,lpbi,dwSize);
切记:在访问完视频格式之后要释放刚才分配的内存;另外,GlobalAllocPtr这个宏是在windowsx.h中定义的,如果用这个宏的话一定要记得包含这个头文件。
7.预览视频
下面的例子用capPreviewRate宏来设置帧输出率66MS(66毫秒)然后用capPreview宏来设置捕捉窗口的预览模式。
capPreviewRate(hWndC,66);
capPreview(hWndC,TRUE);
capPreview(hWndC,FALSE);
8.允许视频覆盖
下面的例子用capDriverGetCaps宏来检测一个视频捕捉驱动是否支持覆盖,如果是则用capOverlay宏去允许覆盖;
CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS));
if(CapDrvCaps.fHasOverlay)
capOverlay(hWndC,TRUE);
9.命名视频捕捉文件
下面的例子用capFileSetCaptureFile宏来为视频捕捉文件准备一个文件名(MYCAP.AVI)并且用capFileAlloc宏来预分配一个5M的空间;
Char szCaptureFile[]=”MYCAP.AVI”;
capFileSetCaptureFile(hWndC,szCaptureFile);
capFileAlloc(hWndC,(1024*1024*5));
10.格式化声音捕捉(张坤注:也就是设置声音捕捉格式,
设置声音采样格式)
下面用capSetAudioFormat设置声音采样格式为11kHz PCM 8bit 立体声
WA VEFORMA TEX wfex;
wfex.wFormatTag = W A VE_FORMAT_PCM;
wfex.nChannels = 2; // 双声道,立体声
wfex.nSamplesPerSec = 11025;
wfex.nAvgBytesPerSec = 22050;
wfex.nBlockAlign = 2;
wfex.wBitsPerSample = 8;
wfex.cbSize = 0;
capSetAudioFormat(hWndC, &wfex, sizeof(W A VEFORMATEX));
11.改变声音采样格式
CAPTUREPARMS CaptureParms;
Float FramesPerSec=10.0;
capCaptureGetSetup(hWndC,&CaptureParams,sizeof(CAPTUREPARAMS)); CaptureParms.dwRequestMicroSecperFrame=(DOWRD)(1.0e6/FramesPerSec); capCaptureSetSetup(hWndC,&CapTureParms,sizeof(CAPTUREPARMS);
12.捕获数据
下面的例子用capCaptureSequence宏来开始捕捉视频,并且用capFileSaveAs把捕捉到的数据从捕捉文件中拷贝到NEWFILE.AVI这个文件中;
char szNewName[] = "NEWFILE.AVI";
capCaptureSequence(hWndC); //开始捕捉.
capFileSaveAs(hWndC, szNewName);