基于IP Multicast的分布式音视频接几和共享的监控系统的传输和实现
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),UNLL,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路前端视频及音频信号,在设计服务器端监控程序时,采用
《基于IP Multicast的分布式音视频接几和共享的监控系统的传输和实现(第3页)》