当前位置:首页 > Windows程序 > 正文

用Delphi实现网络视频编程

2021-05-25 Windows程序

在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当捕获视频数据时触发该事件,在这里可以获得每一帧的数据,进行相关处理,发送到客户端。

二、视频压缩与解压

通过AVICap窗口捕获的每一帧的数据是以BMP(RAW)文件格式存放的,若直接进行传输,数据量非常大,对网络的带宽要求非常高,因此在传输之前必须对每一帧的数据进行压缩处理后再进行传输。具体步骤:

第一步,安装视频压缩引擎。媒体播放器软件都带有压缩引擎,也可以从网上下载单独的解压缩引擎,比如MPEG4或DIVX等。

第二步,初始化压缩引擎。选择压缩引擎,获得压缩引擎的支持,确定输入、输出格式,设置压缩器。

第三步,压缩帧数据。通过指定的压缩引擎,对获取的每一帧数据进行压缩。

解压的过程与压缩的过程类似,通过选择相对应的解压引擎,将压缩的数据解压,以便于回放。

三、数据传输

1.基本概念

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71020.html