微型机与应用
MICROCOMPUTER & ITS APPLICATIONS
2000　Vol.19　No.4　P.29-30



局域网视频数据传输的应用研究
莫宁　俞宁
摘 要： 在运行ＴＣＰ／ＩＰ协议的局域网环境下利用ＵＤＰ用户数据报实现视频数据传输的方法，并使用该方法给出了一个实时视频监视系统的开发实例，对在局域网上开发视频应用系统进行了有益的研究。
关键词： 局域网视频传输 ＴＣＰ／ＩＰ协议 用户数据报 线程
　　如何利用局域网资源实现视频应用系统已逐渐成为人们研究的热门话题。在局域网上实现视频应用系统的技术关键是如何实现视频信息的传输。为了解决视频数据在计算机网络上传输的问题，国际标准化组织提出了一系列的视频数据压缩传输标准。如国际电信联盟（ITU―T）提出的H．323标准，就是针对在局域网和Internet网络上传输压缩视频数据的国际标准。但是在局域网上如何传输压缩以后的视频数据与网络运行的具体通信协议有关。
1　TCP／IP网络
1．1　基本概念
　　TCP／IP得名于2个有名的协议，即TCP（Transmission Control Protocol）协议和IP（Internet Protocol）协议。然而“TCP／IP”并不仅仅指这2个协议，而是常常用来代表相关的一组协议，如UDP（用户数据报协议）、FTP（文件传输协议）等。采用TCP／IP协议的网络被称为TCP／IP网络。TCP／IP网络分层模型定义了5层网络通信协议（应用层、传输层、网际层、链接层和物理层）。其中传输层和网际层是最为重要的，而链接层和物理层在局域网上是采用局域网的协议标准。传输层协议包含2个协议：传输控制协议（TCP）和用户数据报协议（UDP）。TCP／IP的传输层协议与高层协议（ULP）之间的连接对应关系由套接字（Socket）来确定。网际层位于传输层的下方由多种协议组成，IP协议是其中最重要的一个，主要解决网际互联。应用层则根据不同的应用规定了一些标准，如FTP（文件传输协议）、TELENET（仿真终端协议）、SMTP（简单邮件传送协议）等等。
1．2　TCP与UDP比较
　　对于同一网络中的主机到主机的数据传输来说，传输层协议是最重要的协议。用户在编写TCP／IP通信程序时，必须首先选择采用TCP协议或UDP协议，这往往要根据用户的具体应用要求来决定。TCP与UDP的主要差别为：
　　（1）TCP协议是面向连接的，使用TCP协议交换数据前必须先建立通信主机之间的连接关系，在此连接之上传送TCP分组数据并维护此连接，用户数据传送完毕后要撤除连接。UDP协议是无连接的，每个UDP分组都是独立的数据单元。
　　（2）在TCP传输中，高层数据可以以字节流的形式传递给TCP，字节流被TCP缓冲，直到积累到一定的长度时启动1次发送操作。而在UDP协议中，ULP传递给UDP的是对应于UDP数据包的数据块。
　　（3）TCP协议提供可靠传输服务，包括报文序列、流控制、差错检测、优先级等等。而UDP则不提供以上控制，是不可靠服务。
　　由以上比较可以看出UDP协议比TCP协议实现更简单，它省去了建立连接和拆除连接的过程，取消了重发检验机制，能够达到较高的通信速率，其缺陷是不能保证传输的可靠性。因此，TCP协议通常用于数据文件的传输等可靠传输应用，而UDP通常用于对数据可靠性要求不高但数据量大的场合，如图像、语音数据的传输。另外，使用UDP的传输效果与网络的环境密切相关。在局域网的环境下，由于数据传输的误码率是很低的，使用UDP协议传输也能达到很不错的效果。
2　视频监视系统的设计
　　一般对视频监视系统来说，要求系统能实现视频图像的实时传送，尤其是在工业监视等应用场合，为了能及时准确地反映监视现场的情况，图像的延时应不大于400ms。而且在多数情况下，要求实现多个中心监视站同时监视多个现场监视站，这时通信方式不再是简单的点对点方式，而是多点对多点的方式。UDP协议支持广播方式通信，这对于解决图像的多点传送提供了一条简单方便的途径。当有多个中心监视站需要同时监视1个现场监视站时，现场监视站只需简单地以广播方式把数据报送到网上即可。当有多个现场监视站时，可以通过不同的UDP端口号加以区别。基于以上的分析，提出了如图1所示视频传输系统模型。

图1　视频传输系统模型
　　在图1的模型中，各个现场监视站计算机由1个视频捕捉卡与摄像机相连，负责采集并以JPEG方式压缩图像数据，然后以UDP数据报的形式向中心监视站发送。中心监视站负责接受各个现场监视站发送来的UDP数据报，并将UDP数据报组装还原成图像数据，最后解压显示图像。由于中心监视站的任务比较重，因此中心监视站的性能应比较好。在此模型中，由于采取单帧JPEG格式图像传送方式，因此图像传送延时小。另外即使某一图像帧在网络传送中发生错误，很快就被下一帧图像刷新，不会影响图像的监视。
3　视频数据传输软件的设计
3．1　软件开发环境
　　软件选用Windows98开发环境，开发时充分发挥Windows GUI程序的优点。实际采用WinSock来实现现场监视站与中心监视站之间的通信。它是Microsoft牵头开发的1组Windows Socket API函数，扩展了UNIX环境下传统的4BSD Socket，以适应Windows的消息驱动。开发工具选用Inprise公司的Delphi 4．0，它以其使用方便、功能强大而深得广大程序员的喜爱，而且它还提供了1套Internet组件，使开发网络通信程序更加方便。在这套组件中，包括TNMUDP组件，这个组件就是专用于UDP通信的。本软件中的图像数据传输就是通过它来完成的。
3．2　软件的结构
　　根据以上的视频监视系统模型，软件设计包括二部分：现场监视站和中心监视站软件。
　　（1）现场监视站软件
　　现场监视站软件主要由视频数据采集压缩模块和视频数据传输模块组成。现场监视站周期性地捕捉图像，经过压缩后再传输。由于局域网的传输带是有限的，而图像的信息又非常大，如1幅320×240的24位彩色图像的数据量230400B，若每秒捕捉10帧，则图像数据量为2304000B，若不进行压缩，很难在一般的局域网上传输，因此在传输前必须对图像数据压缩。本系统中使用的方法是对每帧图像以JPEG的方式进行软件压缩，压缩品质设为80。经过压缩后，每帧图像的数据量仅有10KB，能满足一般局域网传输要求，且图像质量令人满意。由于采用UDP方式传输图像数据，因此软件本身必须负责将每帧图像拆成UDP数据包，然后发送。以下是图像数据的发送部分程序代码（假定图像数据经过压缩后存放在流ImageStream中）：
　　bufftemp：array［1．．maxsize］of char；
　　bytes，i，divsion，remain：integer；
　　bytes：＝ImageStream．Size；　　　／／获取图像大小
if bytes，＜＞0 then begin
　　divsion：＝bytes div maxsize；　　／／maxsize为每个
　　　　　　　　　　　　　　　　　　　／／UDP包大小
　　remain：＝bytes mod maxsize；
　　FUDP1．SendBuffer（StartSend，5）；／／图像传输开始标记，FUDP1―TNMUDP对象
　　sleep（1）；
　　for i：＝0 to divsion－1 do　　　　／／拆分并发送图
　　　　　　　　　　　　　　　　　　　　／／像数据
　　begin
　　　ImageStream．ReadBuffer（bufftemp，maxsize）；
　　　FUDP1．SendBuffer（bufftemp，maxsize）；
　　end；
if remain ＜＞0 then begin
　　　Imagestream．ReadBuffer（bufftemp，remain）；
　　　FUDP1．SendBuffer（bufftemp，remain）；
　　　　　end；
　　　sleep（1）；
　　FUDP1．SendBuffer（EndSend，5）；　　／／图像传输
　　　　　　　　　　　　　　　　　　　　／／结束标记
　　end；
……
　　（2）中心监视站软件
　　中心监视站软件负责接受UDP数据包并还原成完整的图像数据，然后解压显示图像。当中心监视站的UDP组件收到1个数据包时，就会触发OnDataReceived事件。程序可以在此事件的处理函数中读取图像数据。为了使中心监视站能及时接受所有的UDP数据包，该事件处理函数应尽可能简单、迅速地完成。另外，图像的解压显示功能应在另一个线程中完成。当主线程收到1帧完整的图像数据后，启动（Resume）该线程，该线程完成解压图像显示后应自动挂起（Suspended）。以下是OnDataReceived事件处理函数的部分代码：
　　mstream：TmemoryStream；／／mstream为全局变量，存放
　　　　　　　　　　　　　　／／接受到的图像数据
　　procedure TCenter．NMUDP1DataReceived（Sender∷Tcomponent；NumberBytes：Integer；FromIP：String）；
　　　　　flag：array［1．．5］of char；
　　　　　begin
　　　　　　if Numberbytes＝5 then ／／传输开始，结束
　　　　　　　　　　　　　　　　　／／标记长度均约定为5B
　　　　　begin
　　　　　　NMUDP1．ReadBuffer（flag，5）；
　　　　　If flag＝Startend then exit；　／／接收到
　　　　　　　　　　　　　　　　　　　　／／的数据是传输开始标记
　　　　　if flag＝endsend then　　　　　／／接收到的
　　　　　　　　　　　　　　　　　　　　／／数据是传输结束标记
　　　　　begin
　　　　　　mstream．Seek（0，soFromBeginning）；　　　／／启动图像显示线程
　　　if threadDisplayImage．Suspended then threadDisplayImage．Resume；
　　　　　eixt；
　　　　end
　　　end；
else
　　begin　　　　／／接收到的数据是图像数据
　　　mstream．seek（0，soFromEnd）；
　　　NmUdp1．ReadStream（mstream）；
　　　end；
……
4　结论
　　本文通过分析TCP／IP网络通信协议的传输特点以及视频数据的网络传输要求，提出利用UDP传输协议在局域网上传输视频数据的方法。我们使用这一方法在局域网上成功地实现了1个实时视频监视系统。在此系统中，中心监视站同时监视4个现场监视站。试验时，选用320线的摄像机，图像捕捉卡设置成320×240模式，图像压缩品质设置成80，经过JPEG压缩后，每帧图像大小仅为9KB。中心站选用Intel PⅢ 450 CPU，128MB内存的机器，实际效果可以达到15～20帧／秒。由于本系统使用的是单帧JPEG图像传送方式，因此图像传送的实时效果相当好，特别适用于工业监视等实时性要求比较高的场合，具有较好的实际应用前景。
莫宁（武汉水利电力大学研9703班430072）
俞宁（武汉水利电力大学研9703班430072）
收稿日期：１９９９－１１－１８
