首页 理论教育 实时虚拟课堂直播系统实现

实时虚拟课堂直播系统实现

时间:2022-03-03 理论教育 版权反馈
【摘要】:在实时虚拟课堂教学系统中,可通过Windows Sockets实现IP组播通信的功能。在实时虚拟课堂直播系统中,由于采用组播传输数据,因此学生端接收直播服务器数据时,需要加入直播服务器发送视频和音频数据的组播组,而加入组播组就必须知道该组的组播地址。因为有多个学生端可能加入虚拟课堂,并且学生端的加入和离开是随机的,这个线程被循环执行,直至收到退出系统的命令为止。

5.2.3 实时虚拟课堂直播系统实现

1.关键技术

1)MPEG-4编码技术

MPEG-4标准是MPEG组织制定的比较适合网络传输的视频压缩标准,它对传输速率要求较低。MPEG-4标准与MPEG-1、MPEG-2标准有所不同,后两者主要是基于像素的编码方式,而MPEG-4标准主要是基于对象和内容进行编码。MPEG-4标准的主要优势在于高效压缩、基于内容交互、基于内容分级扩展。在利用MPEG-4进行流媒体传输时,可以根据需要设定MPEG-4的码流速率,清晰度也可在一定的范围内作相应的调整,从而大大提高了系统使用时的适应性和灵活性。

MPEG-4编码器分为软件编码器和硬件编码器,为了满足虚拟课堂教学系统实时性的要求,教师端子系统的实现采用视盈HVC 400硬件压缩卡对视频和音频进行编码与压缩。视盈HVC 400压缩卡支持MPEG-4/WMV/ASF/DIVX/H.264等压缩格式,能够与Windows Media Services无缝链接,并支持PCM音频信道。该压缩卡提供了标准的Direct Show API开发包。

2)Windows Sockets技术

Socket(套接字)是客户机与服务器间实现通信的一种机制,是两台或两台以上计算机之间进行通信的端口。Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例,由Microsoft自定义的一套网络编程接口,它包含了Berkeley Socket风格的库函数。同时,它针对Windows而开发出一组扩展库函数。它应用Windows Socket进行网络编程,可方便地以Windows信息驱动的方式进行软件开发。

Windows Sockets规范提供了一套API,程序开发人员可以简单地进行API调用,并且这套规范也被各家网络软件供应商共同遵守。Windows Sockets的应用,使网络软件遵守共同规范,方便相互的网络数据传输,为网络上不同开发商的软件能够实现兼容奠定了基础。遵守了Windows Sockets规范的网络软件称为Windows Sockets兼容,只要做到Windows Sockets兼容,就可以使网络应用程序进行协同工作,有效提高工作效率。

Windows Sockets规范定义了API,并详细说明其使用方法与互联网协议族链接,这里我们通常使用的是TCP/IP协议。所以,Windows Sockets规范可以说是实现TCP/IP协议的工具。所有Windows Sockets都实现对流套接口和数据报套接口的支持,使用Windows Sockets规范进行软件开发技术较为成熟,功能齐全,可实现安全稳定的数据传输。

2.课堂视音频编码模块实现

课堂音视频编解码模块采用DirectShow技术来实现,并基于HVC400SDK设计出如图5-5所示的DirectShow过滤器连接结构图。

img74

图5-5 DirectShow过滤器连接结构图

在图5-5中,HVC400BDA Analog Xbar是视频和音频端子选择模块,完成视频和音频输入端子的选择。HVC400BDA Analog Capture是视频和音频采集模块,完成视频和音频的采集,并可以实现由模拟信号到数字信号的转换。HVC400BDA MPEG VES Encoder是视频编码模块,对视频数据进行MPEG-4编码,并把编码后的数据传递给视频发送模块WGL Video Sender。WIS MP3Encoder是音频编码模块,对音频数据进行MP3编码,并把编码后的音频数据传递给音频发送模块WGL Audio Sender。

3.虚拟课堂音/视频解码、回放模块实现

学生端子系统的课堂音/视频数据解码、回放采用DirectShow技术来实现,需要考虑学生端电脑是否安装有ffdshow MPEG-4Video Decoder。

1)学生端主机上安装有ffdshow MPEG-4Video Decoder

此解码器会被DirectShow的过滤器图形管理器优先选用为视频数据的解码器。此时,构建的解码过滤器图形如图5-6所示。

img75

图5-6 ffdshow MPEG-4Video Decoder构建的解码过滤器图形

2)学生端主机上没有安装ffdshow MPEG-4Video Decoder

在此种情况下,过滤器图形管理器会选用DivX Decoder Filter作为MPEG-4视频的解码器。此时,DivX Decoder Filter构建的过滤器图形如图5-7所示。

img76

图5-7 DivX Decoder Filter构建的解码过滤器图形

学生端的音频回放过滤器图形采用MPEG Layer-3Decoder作为音频解码器(见图5-8)。

img77

图5-8 MPEG Layer-3Decoder构建的音频解码过滤器图形

4.组播数据传输模块实现

根据所传输的数据类型,可以把虚拟课堂的数据传输通道分为控制信息传输通道和数据信息传输通道。控制信息传输通道用单播在服务器与客户机间建立可靠的链接,传递控制信息,为数据传输准备条件,它基于TCP协议,以保证控制信息传输的可靠性。数据信息传输通道用来在服务器和客户机间传输实时音视频流,它基于UDP协议,以满足音/视频流对实时性的要求。在实时虚拟课堂教学系统中,可通过Windows Sockets实现IP组播通信的功能。Winsock2.0支持IP组播,并提供了一套与协议无关的API。

1)控制信息传输通道实现

在实时虚拟课堂直播系统中,由于采用组播传输数据,因此学生端接收直播服务器数据时,需要加入直播服务器发送视频和音频数据的组播组,而加入组播组就必须知道该组的组播地址。因此,可以通过控制信息传输通道传递组播组地址。为确保可靠性,控制信息的传输通过TCP协议来实现。

在控制通道的实现中,直播服务器单独创建一个线程来接收学生端的请求。如果学生端发出请求组播地址的消息,直播服务器则把组播地址发送到学生端。因为有多个学生端可能加入虚拟课堂,并且学生端的加入和离开是随机的,这个线程被循环执行,直至收到退出系统的命令为止。控制信息传输通道工作流程图如图5-9所示。

img78

图5-9 控制信息传输通道工作流程图

2)实时虚拟课堂数据信息传输通道实现

直播服务器子系统数据信息发送模块工作流程图如图5-10所示。

img79

图5-10 直播服务器子系统数据信息发送模块工作流程图

直播服务器子系统数据信息发送模块的具体实现代码如下。 //创建组播套接字

multisock=WSASocket(AF_INET,

           SOCK_DGRAM,

           IPPROTO_UDP,

           (LPWSAPROTOCOL_INFO)NULL,0,

           WSA_FLAG_MULTIPOINT_C_LEAF|

           WSA_FLAG_MULTIPOINT_D_LEAF);

//设置套接字选项

bFlag=TRUE;

status=setsockopt(multisock,SOL_SOCKET,SO_REUSEADDR,

          (char*)&bFlag,sizeof(bFlag));

//绑定套接字,将创建好的套接字与本地地址和本地端口绑定。

localAddr.sin_family=AF_INET;

localAddr.sin_port=htons(LOCALPORT);

localAddr.sin_addr.s_addr=INADDR_ANY;

status=bind(multisock,(struct sockaddr FAR*)

  &localAddr,sizeof(struct sockaddr));

//设置组播套接字的模式

bFlag=FALSE;

status=WSAloctl(multisock,SIO_MULTIPOINT_LOOPBACK,

         &bFlag,sizeof(bFlag),NULL,0,&cbRet,NULL,NULL);

//发送组播数据,其中,destAddr为组播组的地址

Status=WSASendTo(multisock,stWSABuf,1,&cbRet,0,

         (struct sockaddr FAR*)&destAddr,

          sizeof(destAddr),NULL,NULL);

学生端子系统数据信息接收模块的工作流程图如图5-11所示。

img80

图5-11 学生端子系统数据信息接收模块的工作流程图

学生端子系统数据信息接收模块的实现代码如下。

//创建组播套接字

sock=WSASocket(AF_INET,

         SOCK_DGRAM,

         IPPROTO_UDP,

        (LPWSAPROTOCOL_INFO)NULL,0,

         WSA_FLAG_MULTIPOINT_C_LEAF

         |WSA_FLAG_MULTIPOINT_D_LEAF);

//绑定套接字,将创建好的套接字与本地地址和端口绑定localAddr.sin_family=AF_INET;

localAddr.sin_port=htons(LOCALPORT);

localAddr.sin_addr.s_addr=INADDR_ANY;

status=bind(sock,(struct sockaddr FAR*)

      &localAddr,sizeof(struct sockaddr));

//加入组播组

destAddr.sin_family=PF_INET;

destAddr.sin_port=htons(DESTPORT);

destAddr.sin_addr.s_addr=inet_addr(destAddr);

multisock=WSAJoinLeaf(sock,(PSOCKADDR)

            &destAddr,sizeof(destAddr),NULL,NULL,

            NULL,NULL,JL_RECEIVER_ONLY);

//接收组播数据

WSARecvFrom(multisock,&stWSABuf,1,&cbRet,

      &bFlag,(struct sockaddr*)&destAddr,

      &iLen,NULL,NULL);

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈