基于IP Multicast分布式音视频介入的传输设计
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组播在两个层面上都?quot;无根"的。任一用户发送的数据都将被传送到组中所有其它成员。最后一个参数表明新创建的套接字在控制层面与数据层面都是"无根的"。
可以通过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多线程机制实现了音视频数据的实时、多点传输和控制信号的可靠传输,提高了程序运行的效率。在该系统的基础上进行改造与扩展,可以应用到远程教学、远程医疗等多种多媒体通信;因此,远程数字音视频监控系统的设计和实现不仅具有监控方面的现实意义,而且对于许多应用都有借鉴和参考价值。
- 网络视频监控内外网互通与安全隔离方案(01-10)
- 新一代视频监控存储方案(05-17)
- UIT分布式视频监控存储解决方案(07-06)
- IP视频监控打造“平安城市”(10-13)
- CDMA远程无线网络视频监控系统解决方案(11-23)
- 深入研究嵌入式web服务器的视频监控应用(01-14)