基于IP Multicast的分布式音视频接入和共享的监控系统的传输设计和实现
2008-09-18
作者:周承芳 汪志兵 唐 昆 杜
摘 要: 设计并实现了一个基于IP Multicast技术的远程数字音视频" title="音视频">音视频监控系统" title="监控系统">监控系统, 提出了分布式音视频接入和共享的解决方案, 能够有效地节省网络带宽;针对视频、音频语音和控制数据的不同传输特点, 对其所采用的传输技术作了详细探讨,给出了具体实现方法。
关键词: 监控系统 分布式接入和共享 网络传输 IP组播" title="组播">组播 Windows套接字
随着计算机网络技术、多媒体技术、计算机视觉与模式识别技术的发展,一种以数字化、智能化为特点的多媒体远程数字监控系统应运而生,即基于IP的数字监控系统,实现了由传统的模拟监控到数字监控质的飞跃。与传统的模拟监控系统相比较,数字远程监控系统几个最主要的优势是:可以借助网络实现远程监控;在远程不同地点的分控中心或同一个分控中心可同时调看某一个或者几个监控现场的音视频数据,从而实现分布式的音视频接入和音视频数据共享,同时,可以与监控现场人员进行对讲;可以对远程监控现场的云台" title="云台">云台、摄像机等外围设备进行控制。视频、音频的实时、分布式传输及控制指令的可靠传输是远程数字监控系统的一个关键问题。本文设计并实现了远程数字音视频监控系统,采用IP Multicast技术作为分布式音视频接入和共享的解决方案,并针对视频、音频语音和控制数据不同的特点,对其所采用的不同传输技术进行了探讨,给出了具体实现方法。
1 系统的总体结构
远程监控系统一般包括三部分:前端监控现场、通信设备和后端分控中心。整个系统基于Client/Server(客户机/服务器)模式。总体结构如图1所示。
(1)前端监控现场由监控现场主机及一些外围设备组成。外围设备包括摄像机、电动镜头、云台、防护罩、监视器、多功能解码器及报警器。监控现场主机运行客户端" title="客户端">客户端软件,实现视频、音频数据的实时采集、压缩、解压缩(音频)(视频传输是单向的,音频传输是双向的)及打包传送;对压缩的视(音)频数据进行数字化存储(也可在分控中心进行)。存储方式为循环存储、定时存储、手动存储及运动视频检测启动存储。接收来自分控中心的控制指令(也可在本地实施),对云台动作(上、下、左、右及自动)电动镜头的三可变(光圈、焦距和聚焦)。
(2)通信设备是指所采用的传输信道和相关设备,通信网络为LAN及WAN。
(3)后端设备由若干分控中心计算机组成。各分控计算机运行服务器端软件,接收来自前端的压缩视(音)频,解压缩、压缩(音频)、显示(播放);通过网络对前端云台、摄像机进行控制;采用组播技术,实现分布式视频接入和分布式视频共享:每个分控中心主机可以同时监控多个前端,即“一点对多点”;不同分控中心也可以同时监控同一前端,即“多点对一点”。
2 网络传输模块的设计与实现
2.1 系统传输数据类型的特点及通信协议的选择
系统传输数据有:控制数据,音频、视频数据。后端分控中心通过网络向监控现场主机的外围设备云台及摄像机发送控制信号,实现云台动作(上、下、左、右、自动)摄像机光圈、焦距及聚焦三可变,要求控制信号的传输准确无误;音频、视频是连续媒体,数据量大,允许传输中存在一定的数据错误率及数据丢失率,但实时性要求很高。此外,在监控系统中,要实现音视频的分布式接入和数据共享,必须进行音视频的多点传输。怎样实现上述目标?首先是通信协议的选择,TCP/IP协议是广泛使用的互联网协议,其网络模型定义了四层(即网络接口层、网络层、传输层、应用层)网络通信协议。传输层包含两个协议:传输控制协议(TCP)和用户数据报协议(UDP)。IP是网际互联协议,位于网络层。TCP协议是面向连接的,提供可靠的流服务;UDP是无连接的,提供数据报服务;TCP采用提供确认与超时重发、滑动窗口机制等措施来保证传输的可靠性,正是这些措施增加了网络的开销。如果用TCP传输视(音)频数据,大量的数据容易引起重传,使得网络负载增大并会加大延迟;UDP协议是最简单的传输协议,不提供可靠性保证,正因为UDP协议不进行数据确认与重传,大大提高了传输效率,具有高效快速的特点;IPv4定义了三种IP数据包的传输:单播、广播及组播。要在系统中实现视(音)频数据的多点传输,若采用单播,则同样的音、视频数据要发送多次,这将导致发送者负担重、延迟长、网络拥塞;若用广播, 网络中的每个站点都将接收到数据,不管该结点是否需要数据,增加了非接收者的开销;组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的、同时的)的网络技术。组播源把数据包发送到特定组播组,而只有属于该组播组的地址才能接收到数据包。由于无论有多少个目的地址,在整个网络的任何一条链路上都只传送单一的数据包。因此组播提高了网络传输的效率,极大地节省了网络带宽。本系统采用组播技术实现实时音(视)频数据的多点传输。组播方式只适用于UDP。综上所述,采用TCP/IP传输控制信号,即信令通道;采用UDP/IP传输音视频信号,即数据通道。
IP组播依赖一个特殊的地址组——“多播地址”,即D类地址。范围在224.0.0.0—239.255.255.255之间(其中224.0.0.0-224.0.0.255是被保留的地址),D类地址是动态分配和恢复的瞬态地址。组播地址只能作为信宿地址使用,而不能出现在任何信源地址中。每一个组播组对应于动态分配的一个D类地址。组播的特点:组播组的成员是动态的,主机可以在任何时间加入或离开组播组,主机组中的成员在位置上和数量上是没有限制的。
2.2 Windows下,IP组播的Winsock2实现
Windows环境下组播通信是基于Windows Socket的。Windows Socket 提供两种不同的IP组播的实现方法:Winsock1与Winsock2。在Windows2000平台采用VC++6.0开发工具,在本系统中实现了基于Winsock2的组播通信编程。
发送端(前端、客户端)实现步骤:
(1)加载Winsock2库,完成Winsock2的初始化:
WSAStarup(MAKEWORD(2, 2), &wsaData);
(2)建立本地套接字(UDP):
m_socket=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL, 0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
//组播通信具有两个层面的重要特征:控制层面和数据层面。控制层面决定一个多播组建立通信的方式,数据层面决定通信成员间数据传输的方式。每一个层面有两种形式,一种是“有根的”,另一种是“无根的”;数据报IP组播在两个层面上都是“无根”的。任一用户发送的数据都将被传送到组中所有其它成员。最后一个参数表明新创建的套接字在控制层面与数据层面都是“无根的”。
可以通过setsocket函数设置套接字的属性,如允许地址重用,缓冲区是接收还是发送。
m_localAddr . sin_family = AF_INET;
m_localAddr.sin_port = m_iPort;//本地端口号
m_localAddr..sin _addr. S_un.S_addr=m_uLocalIP;//本地IP地址;
(3)绑定(将新创建的套节字与本地插口地址进行绑定):
bind(m_socket, (PSOCKADDR)&(m_localAddr), sizeof(m_localAddr));
(4)设置生存时间(即数据包最多允许路由多少个网段):
WSAIoctl(m_socket,SIO_MULTICAST_SCOPE, //设置数据报生存时间;
&iMcastTTL, // 生存时间大小;
sizeof(iMcastTTL),NULL,0,&cbRet,NULL, NULL);
(5)配置Loopback, 以决定组播数据帧是否回送:
int bLoopback = FALSE;
WSAIoct(m_socket, SIO_MULTIPOINT_LOOPBACK,
//允许或禁止组播数据帧回送;
&bLoopback, sizeof(bLoopback), NULL, 0, &cbRet, NULL, NULL);
(6)收发数据:
在发送方(前端、客户端)响应发送的消息函数中调用下面函数:
WSASendTo(m_socket,&stWSABuf,1,&cbRet,0,(struct sockaddr*)&stDestAddr, // 发送的目的地址;
sizeof(struct(sockaddr), NULL, NULL));
在发送方(前端、客户端)响应接收消息函数中调用下面函数:
WSARecvFrom(m_socket,&stWSABuf,1, & cbRet,&Flag, (struct sockaddr*)&stSrcAddr, //源地址;
&iLen, NULL, NULL);
(7)将组播套接字设置为异步I/O工作模式,在该套节字上接收以事件为基础的网络事件通知:
WSAEventSelect(m_socket, m_hNetworkEvent, //网络事件句柄;将此套节字与该事件句柄关联在一起;
FD_WRITE|FD_READ);// 发生此两个事件之一,则将m_hNetworkEvent置为有信号状态;
(8)在工作线程中设置:
WSAWaitForMultipleEvent(3,//等待事件的个数;
p->m_eventArray,//存放事件句柄的数组;
FALSE, WSA_INFINITE, FALSE);
(9)关闭组播套节字:
closesocket(m_socket);
接收端(后端、服务器端)实现步骤:
(1)—(3)与发送端(客户端)相同;
(4)调用WSAJLoinLeaf加入组播组:
SOCKET NetSock=WSAJoinLeaf(sock,//必须为组播标志进行创建,否则调用失败;
(PSOCKADDR)&(m_stDestAddr,//组播地址,与发送方的目的地址相同;
sizeof(m_stDestAddr), NULL, NULL, NULL, NULL,
JL_BOTH));//允许接收和发送;
(5)与客户端(6)相同;(6)与客户端(7)相同;(7)与客户端(8)相同;(8)离开组播组;closesocket(NewSock);// NewSock是调用WSAoinLeaf()返回的套节字。
2.3 在监控系统中网络传输模块的设计
网络传输模块流程如图2所示。
发送端(前端监控现场主机、客户端)监控主机运行客户端程序。在主线程中,启动视频、音频两个线程分别对视频及音频进行采集,放入视(音)频缓冲区;视频在本地回放;同时,监听分控中心的连接请求,收到连接请求,TCP三次握手,建立TCP连接(信令通道);通过信令通道,向分控中心发送二组组播地址及端口号(对应视频及音频,给每个监控点分配一对组播地址及端口号),启动视频、音频两个线程;分别在视(音)频线程中完成:利用Winsock2建立视(音)频数据通道(UDP)(源码前已述及);对视(音)频进行压缩编码、组播发送;音频线程接收分控中心的音频数据包,解码并播放;实现视频的单向传输和音频的双向传输。
接收端(后端分控中心、服务器端)分控中心主机运行服务器端程序,在主线程中向前端监控现场主机发出连接请求(CALL),三次握手建立TCP连接(信令通道);后端接收到组播地址及端口号后,启动视(音)频两个线程,完成;利用Winsock2建立视(音)频数据通道(UDP),加入视(音)频组播组,接收压缩视(音)频包,并解码显示(播放);其中音频线程,还要完成音频数据包的压缩、发送;实现视频的单向传输、音频的双向传输。
一个后端分控中心可同时监控12路前端视频及音频信号,在设计服务器端监控程序时,采用多线程技术,每建立一对前端监控主机与后端分控中心(服务器)的TCP连接,就开两个接收线程(一个接收视频线程;一个接收音频线程), 视频线程接收视频数据包进行解压缩及回放;音频线程接收音频数据包进行解压缩及播放。对云台及摄像机的控制指令通过信令通道传输。
本系统运行在Win2000平台上,用VC++6.0开发工具开发。
在远程数字音视频监控系统的传输模块设计中,根据音视频数据传输及控制信号传输的特点,运用IP组播技术极大地减轻了网络负担,避免了资源的浪费,节省了网络带宽;利用TCP/IP协议设计了信令通道(TCP)和数据通道(UDP);运用Windows多线程机制实现了音视频数据的实时、多点传输和控制信号的可靠传输,提高了程序运行的效率。在该系统的基础上进行改造与扩展,可以应用到远程教学、远程医疗等多种多媒体通信;因此,远程数字音视频监控系统的设计和实现不仅具有监控方面的现实意义,而且对于许多应用都有借鉴和参考价值。
参考文献
1 杨 磊.电视监控实用技术.北京:机械工业出版社,2002
2 徐立新.李宗斌. IP组播技术的API编程实践. 微型机与应用, 2002;21(6)
3 蒋东兴.Windows Sockets网络编程设计大全. 北京:清华大学出版社,1999
4 W Richard Stevens. TCP/IP详解 卷1:协议.北京:机械工业出版社,
5 王险峰. Windows环境下的多线程编程原理与应用.北京:清华大学出版社,2002
6 David J. Kruglinski.Visual C++6.0技术内幕(第五版).北京:北京希望电子出版社, 2002