朱明东
摘要 本文结合一个简单的视频聊天程序,阐述了网络视频技术的基本原理、开发步骤,并详细介绍了用Delphi开发网络视频程序的过程。
关键词 Delphi,视频聊天,AVICap
在MSN、QQ等聊天类的应用程序中,都应用到了网络视频技术。Delphi使用是Object Pascal语言是一种完全面向对象语言,可以开发出灵活强大的程序,开发视网络频程序也不在话下。一个完整的网络视频程序应包括以下几个关键技术:视频频捕、视频压缩与解压、数据传输。
一、视频频捕
1.基本概念
微软为软件开发人员提供了一个专门用于视频捕获的VFW (Video for Windows) SDK,为在Windows系统中实现视频捕获提供了标准的接口,从而大大方便了视频捕获程序的开发。由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中重新声明DLL中的各个函数和变量(可以参考MSDN中的VC的函数声明以及变量定义,也可以从网上下载写好的头文件vfw.pas)。
VFW是Microsoft 1992年推出的关于数字视频的一个软件包,它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给程序员提供VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
2.AVICap编程
AVICap支持实时的视频流捕获和单帧捕获并提供对视频源的控制,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。同时,它也可将数字视频捕获到文件。AVICap编程的基本步骤包括:
第一步,创建AVICap窗口。通过capCreateCaptureWindow函数创建一个捕获窗,所有的捕获操作及其设置都以它为基础。窗口风格一般为WS_CHILD和WS_VISIBLE。
第二步,设置AVICap窗口的相关属性。通过capPreviewRate函数设置视频捕获速率;通过capPreview函数或capOverlay函数设置显示视频时的模式(普通的摄像头不能用overlay的方式);通过capSetVideoFormat函数设置视频格式(包括长度、宽度等);通过capDlgVideoSource、capDlgVideoFormat、capDlgVideoCompression显示控制视频源、视频格式、视频压缩的对话框。
第三步,定义回调函数。定义捕获帧回调函数,获得每一帧的数据,并对每一帧的数据进行处理,比如压缩、传输到客户端等;定义窗口状态回调函数,获得窗口的状态;定义错误回调函数,获得并处理错误信息。
3.相关控件
虽然利用上面介绍的API可以实现视频捕获编程,但如果将这些API封装成一个控件则编程更为方便,这样的控件可以从常用Delphi网站找到。本文以TvideoCap控件为例,实现视频捕获。
(1) 相关属性及方法
DriverIndex该属性是用来指定视频捕获设备序号,从0开始。
DriverOpen该属性是用来确定是否打开指定的视频捕获设备。设置为True表示打开,False表示关闭。
CapToFile该属性是用来确定捕获的同时是否将捕获的画面保存成AVI格式的视频文件。设置为True表示保存,False表示不保存。
VideoPreview该属性是确定捕获的同时是否预览。设置为True表示预览,False表示不预览。
StartCapture该方法是用来捕获视频数据,执行该方法后才会触发相关事件。
其他的属性和方法这里就不一一介绍。
(2) 相关事件
OnVideoStream当捕获视频数据时触发该事件,在这里可以获得每一帧的数据,进行相关处理,发送到客户端。
|