-
VFW
视频问题
哎呀
今天借了王明的
程序员成长攻略一书,发现里头好多错误的。
不过自己
还是看出了
后来看看网上的
哎呀别人写的好多了。就转下来把!
3.2
使用视频捕获
3.2.1
创建捕获窗体
下面的例子通过使用
capCrea
teCaptureWindow
函数来创建一个捕获窗体
hWndC = capCreateCaptureWindow
(
(LPSTR)
//
如果是
Pop-
up
窗口的窗口名称
WS_CHILD | WS_VISIBLE,
//
窗口类型
0, 0, 160,
120,
//
窗口位置和尺寸
(HWND) hwndParent,
(int) nID /* child ID
*/);
3.2.2
连接到一个捕获驱动器
下面举例,如何通过捕获窗口的句柄
hWndC
连接到
MS VIDEO
驱动程序上,
同时还演示了如何断开连接。使用
capDriverDisconnect<
/p>
:
fOK =
SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L);
//
或者使用宏连接:
// fOK = capDriverConnect(hWndC, 0);
//
关闭连接
capDriverDisconnect (hWndC);
3.2.3
列举安装的捕获驱动程序
使用
capGetDriverDe
scription
函数来获得系统已经安装的所有捕获驱动
程序
的名称和版本。
char
szDeviceName[80];
char
szDeviceVersion[80];
for
(wIndex = 0; wIndex < 10; wIndex++)
{
if (capGetDriverDescription (wIndex,
szDeviceName,
sizeof (szDeviceName), szDeviceVersion,
sizeof
(szDeviceVersion))
{
//
加入名字到一个已经安装的设备列表中
//
让用户选择一个使用。
}
}
3.2.4
获得捕获驱动器的性能参数
WM_CAP_DRIVE
R_GET_CAPS
消息可以返回捕获驱动程序以及其硬件的
性能参数。这些信息存放在一个
CAPDRIVERCAPS
的
数据结构中。当你的应用
程序的捕获窗口连接到一个新的捕获驱动器后,都会刷新这个<
/p>
CAPDRIVERCAPS
数据结构。下面将使用
capDriverGetCaps
宏来获得捕获设备
的性能参数。
CAPDRIVERCAPS
CapDrvCaps;
SendMessage
(hWndC, WM_CAP_DRIVER_GET_CAPS,
sizeof (CAPDRIVERCAPS),
(LONG) (LPVOID) &CapDrvCaps);
//
或者,使用宏来获得驱动器的新能参数
// capDriverGetCaps(hWndC,
&CapDrvCaps, sizeof (CAPDRIVERCAPS));
3.2.5
获得捕获窗口状态
(Status)
下面例子使用
SetWindowPos
函数区设置捕获窗
口的尺寸,
这个尺寸的大小是基
于输入的视频流大小的。输入视
频流的尺寸大小由
capGetStatus
宏来获得,获得<
/p>
信息放在一个
CAPSTATUS
的数据
结构体中。
CAPSTATUS
CapStatus;
capGetStatus(hWndC, &CapStatus, sizeof
(CAPSTATUS));
SetWindowPos(hWndC, NULL, 0, 0, eWidth,
eHeight, SWP_NOZORDER | SWP_NOMOVE);
3.2.6
显示对话框区设置视频属性
每个捕获驱动器都可
以提高
3
个以上的不同对话框来控制数字视频的特性
和捕获处理。
下面的例子示范如何显示这些对话框。
在显示每个对话框前,
该例
会调用
c
apDriverGetCaps
宏并且检查返回的
CAPDR
IVERCAPS
对象来查看是
否可以能够显示特定的对话框。
CAPDRIVERCAPS
CapDrvCaps;
capDriverGetCaps(hWndC, &CapDrvCaps,
sizeof (CAPDRIVERCAPS));
//
视频源对话框
if (gVideoSource)
capDlgVideoSource(hWndC);
//
视频格式对话框
if (gVideoFormat)
{
capDlgVideoFormat(hWndC);
//
是否由新的图像尺寸?
Are there new
image dimensions?
capGetStatus(hWndC, &CapStatus, sizeof
(CAPSTATUS));
//
如果有,发送通知给父窗口,告诉它尺寸改变了
}
//
视频显示对话框
if (gVideoDisplay)
capDlgVideoDisplay(hWndC);
3.2.7
获得和设定视频格式
BITMAPINFO
数据结构体可
以实现长度可调节地去适应标准压缩的数据格
式。
因为它的长度
可以变,
所以在每次获得当前视频格式前,
都必须去查询这个<
/p>
结构的长度以及分配的内存大小。
该例子使用了
< br>capGetVideoFormatSize
宏去获
得
缓存区大小,使用
capGetVideoFormat
宏区获
得当前视频格式。
LPBITMAPINFO lpbi;
DWORD dwSize;
dwSize =
capGetVideoFormatSize(hWndC);
lpbi = GlobalAllocPtr (GHND,
dwSize);
capGetVideoFormat(hWndC, lpbi, dwSize);
//
访问视频格式,并且释放分配的内存。
应用程序使用
capSetVide
oFormat
宏
(WM_CAP_SET_VIDEOFOR
MAT)
,
把一个
BITMAPINF
O
结构发送给捕获窗口,显示修改。因为视频格式由设备指定的,
你的应用程序可以去检查获得的返回值,来知道这个视频格式是不是公开的。
3.2.8
预览视频
下面使用
capPre
viewRate
宏来设置预览模式的帧频率为
66
毫秒
/
帧,使用
capP
review
宏在捕获窗口预览图像。
capPreviewRate(hWndC, 66);
//
速度
,
微秒
capPreview(hWndC, TRUE);
//
开始预览
capPreview(hWnd, FALSE);
//
屏蔽预览
3.2.9
允许视频覆盖
(Overlay)
下面使用
capDriverGet
Caps
宏去检测这个捕获驱动是否支持覆盖
(Overlay
)
模式
,
如果支持,就允许视频覆盖模
式;
CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hWndC, &CapDrvCaps,
sizeof (CAPDRIVERCAPS));
if
(erlay)
capOverlay(hWndC, TRUE);
3.2.10
捕获文件命名
下例使用
< br>capFileSetCaptureFile
宏来指定一个要命名的文件名(<
/p>
),
使用
cap
FileAlloc
宏去预分配
5MB
的文件。
char
szCaptureFile[] =
capFileSetCaptureFile( hWndC,
szCaptureFile);
capFileAlloc( hWndC, (1024L * 1024L *
5));
3.2.11
格式化音频捕获
下例使用
capSetAudioF
ormat
来设置音频格式为
11-KHz PCM
8-bit,
立体声。
WAVEFORMATEX wfex;
tTag = WAVE_FORMAT_PCM;
els = 2;
//
使用立体声
esPerSec
= 11025;
tesPerSec =
22050;
Align = 2;
erSample = 8;
=
0;
capSetAudioFormat(hWndC,
&wfex, sizeof(WAVEFORMATEX));
3.2.12
改变视频捕获设置
下例使用
capCaptureGetSetup
和
cap
CaptureSetSetup
宏来改变捕获速度,
从
默认值
(15
帧
/<
/p>
秒
)
到
10
p>
帧
/
秒。
-
-
-
-
-
-
-
-
-
上一篇:描写沙漠的词语
下一篇:有关描写春天的优美词语