一种基于UDP和组播的投屏直播方法及***
技术领域
本发明属于投屏播放技术领域,具体涉及一种基于UDP和组播的投屏直播方法及***。
背景技术
在会议投屏直播中,单台主播设备既要进行音视频数据的采集,同时又要担负对多台加入的设备进行实时推流的能力,这样在内存及并发推流能力上就会很快陷入瓶颈。在使用TCP进行推流的测试过程中发现,在保证一定的清晰度质量的前提下,当连接设置超过20台之后就开始出现明显的卡顿现象。
出现卡顿是因为推流端是基于应用扩展方式实现,采用这种扩展方式要求在推流过程中内存使用不能超过50兆,因此,不可能每个连接都对发送数据开辟一份独立的缓存。在使用TCP和UDP进行单台设备的投屏直播的测试过程中,不到几分钟,主播设备的内存使用就轻松越过了50兆这根红线。造成上述现象的原因是一方面数据发送的速度远远低于数据生成的速度,另一方面随着连接数的增加,重复缓存的数据不断增多,发送的效率不断下降。
采用异步方式调用主播设备的***层来发送推流缓存,在进行真机测试时,由于成功地把内存压力传递到***层,测试得出应用扩展的消耗内存几乎一直处于一个非常稳定的水平,在设置20台接收端设备的情况下,内存消耗稳步在10兆以下。但受限于当前发送端数据发送的能力及可用带宽,在测试过程中发现部分接收设备仍然出现卡顿现象。
发明内容
有鉴于此,本发明提出了一种基于用UDP和组播的投屏直播方法及***,用于解决在投屏直播中推流端并发性不高的技术问题。
本发明第一方面,公开一种基于UDP和组播的投屏直播方法,所述方法包括:
通过组播服务器动态生成组播地址并根据接收端接入数量进行组播地址动态分配;
主播端对待发送数据进行UDP分片并发送至组播服务器;
接收端基于分配的组播地址监听并接收数据。
优选的,所述通过组播服务器动态生成组播地址并根据接收端接入数量进行组播地址动态分配具体包括:
主播端在组播服务器的登记服务中建立会议房间,获取组播服务器根据会议房间生成并分配的组播地址;
各个接收端在登记服务中选择会议房间,验证通过后分别获取会议房间对应的组播地址。
优选的,所述验证为访问密码验证,接收端选择会议房间后,输入访问密码,将输入的访问密码与组播服务器预先设置的会议房间访问密码匹配,若匹配成功,则验证通过。
优选的,所述主播端对待发送数据进行UDP分片具体为:
设定对待发送数据分片的长度阈值,使分片后每个发出去的UDP分片报文的IP包头、UDP包头、分片信息包头和负载长度之和不超过通讯网络的MTU值,并且不会引起网络层对数据进行二次分片处理;
通过所述长度阈值从待发送数据的报文中分出第一分片数据;
判断剩余待发送数据的报文长度是否超过所述长度阈值,若是,通过所述长度阈值从剩余待发送数据的报文中继续分出分片数据,直到待发送数据的报文长度小于或等于所述长度阈值;
确定UDP分片数量N。
优选的,确定UDP分片数量N具体包括:
将完整待发送数据报文的长度值与所述长度阈值相除,获取商值和余数;
若所述余数为0,则将所述商值作为UDP分片数量N;
若所述余数不为0,则将所述商值加1作为UDP分片数量N;
得到所述待发送数据的N个UDP分片报文。
优选的,所述接收端基于分配的组播地址监听并接收数据具体包括:
接收端建立目录句柄;
接收端根据组播服务器的组播地址动态分配结果监听会议房间对应的组播地址,接收UDP分片数据;
接收端缓存UDP分片数据并进行数据包重组。
优选的,所述进行数据包重组具体包括:
获取缓存的UDP分片数据,通过FEC前向纠错操作进行丢包检测;
通过ipasfrag数据结构来表示一个分片,通过ipq数据结构属于同一原始数据包的所有分片构成的队列;
当一个UDP分片报文到达时,根据其中的标识号信息将其定位到所属的ipq上,然后根据长度和偏移信息***到ipq队列中;
检测ipq是否完整,当所有分片都已成功接收,将队列中所有ipasfrag组合起来,重组为原数据包。
本发明第二方面,公开一种基于UDP和组播的投屏直播***,所述***包括:
地址分配模块:通过组播服务器动态生成组播地址并根据接收端接入数量进行组播地址动态分配;
分片发送模块:主播端对待发送数据进行UDP分片并发送至组播服务器;
数据接收模块:接收端基于分配的组播地址监听并接收数据。
本发明第三方面,公开一种电子设备,包括:至少一个处理器、至少一个存储器、通信接口和总线;
其中,所述处理器、存储器、通信接口通过所述总线完成相互间的通信;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令,以实现如本发明第一方面所述的方法。
本发明第四方面,公开一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机实现如本发明第一方面所述的方法。
本发明相对于现有技术具有以下有益效果:
1)本发明采用UDP+组播方式进行投屏直播,提高了推流端的并发性,同时也不会产生内存问题。接收端只要监听指定的组播IP,打开数据接收逻辑,即可实现组播内数据的复制与共享;推流端也只需要向指定的单一组播IP发送数据,对于组播内接入的接收端数量增多的情况,推流端发送的效率也不会受影响,减少接收端卡顿现象。
2)本发明在主播端对待发送数据进行UDP分片发送,在接收端接收分片数据并建立UDP分片队列,当UDP分片报文到达时,根据其中的标识号信息将其定位到所属的ipq上,然后根据UDP分片信息中的长度和偏移信息***到ipq队列中,快速实现数据包重组,减少丢包。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的基于UDP和组播的投屏直播方法流程图;
图2为本发明的基于UDP和组播的投屏直播***结构图。
具体实施方式
下面将结合本发明实施方式,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式仅仅是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
请参阅图1,本发明提出一种基于UDP和组播的投屏直播方法,所述方法包括:
S1、通过组播服务器动态生成组播地址并根据接收端接入数量进行组播地址动态分配;
首先对组播地址进行动态生成、动态分配和动态管理。投屏直播主播端(推流端)的发送步骤如下:
主播端首先在组播服务器的登记服务中建立会议房间并设置访问密码,组播服务器生成并成功分配组播地址返回到主播端。
接收端在登记服中选择自己想要进入的会议房间,输入访问密码并成功验证后,返回会议房间对应的组播地址到接收端。所述验证为访问密码验证,接收端选择会议房间后,输入访问密码,将输入的访问密码与组播服务器预先设置的会议房间访问密码匹配,若匹配成功,则验证通过。
S2、主播端对待发送数据进行UDP分片并发送至组播服务器;
在发送UDP数据之前,必须对数据进行分片操作,以保证每个发出去的UDP报文不会超过通讯网络的MTU(Maximum Transmussion Unit,最大传输单元)值,并且不会引起网络层对数据进行二次分片处理。不触发网络层的二次分片有利于对UDP进行丢包处理,且sendto函数对单次调用发送的数据有数量限制,因此需要在应用层主动分片。
对待发送数据进行UDP分片具体包括如下分步骤:
设定对待发送数据分片的长度阈值,该长度阈值的设定标准为:使分片后每个发出去的UDP分片报文的IP包头、UDP包头、分片信息包头和负载长度之和不超过通讯网络的MTU值,并且不会引起网络层对数据进行二次分片处理;
通过所述长度阈值从待发送数据的报文中分出第一分片数据;
判断剩余待发送数据的报文长度是否超过所述长度阈值,若是,通过所述长度阈值从剩余待发送数据的报文中继续分出第二分片数据,重复该判断、分片过程直到待发送数据的报文长度小于或等于所述长度阈值;
确定UDP分片数量N;具体的,将完整待发送数据的报文的长度值与所述长度阈值相除,获取商值和余数;若所述余数为0,则将所述商值作为UDP分片数量N;若所述余数不为0,则将所述商值加1作为UDP分片数量N;得到所述待发送数据的N个UDP分片报文。
最后将各UDP分片报文发送至组播服务器。
S3、接收端基于分配的组播地址监听并接收数据。
接收端建立目录句柄;
接收端根据组播服务器的组播地址动态分配结果监听会议房间对应的组播地址,接收UDP分片数据;由于组播服务器已为接收端动态生成并组播地址,接收端只需要监听固定的组播IP地址即可实现组播内数据的复制与共享,因而可以接收到所需要的UDP分片数据。
接收端缓存UDP分片数据并进行数据包重组。具体的,进行数据包重组的过程具体包括:
获取缓存的UDP分片数据,通过FEC前向纠错操作进行丢包检测,若发现丢包则进行重传通过ipasfrag数据结构来表示一个分片,通过ipq数据结构表示属于同一原始数据包的所有分片构成的队列;
当一个UDP分片报文到达时,根据其中的标识号信息将其定位到所属的ipq上,然后根据长度和偏移信息***到ipq队列中;
检测ipq是否完整,当所有分片N都已成功接收,将队列中所有ipasfrag组合起来,重组为原数据包。同时回收所占据的资源。如果在规定时间内某个ipq无法收到所有分片,它将会被丢弃,资源被回收并用于后续ipq的分配。
本发明为分片数据建立了一个队列,将每个UDP分片报文作为队列中的一个元素,通过ipq、ipasfrag这两个数据结构使用双向链表实现队列元素的快速***和删除,进而实现数据包重组,节省资源的同时减少丢包。
本发明采用UDP+组播方式进行投屏直播,提高了推流端的并发性,,接收端只要监听指定的组播IP,打开数据接收逻辑,即可实现组播内数据的复制与共享;推流端也只需要向指定的单一组播IP发送数据,适用于组播内接入的接收端数量增多的情况,减少卡顿。
与上述方法实施例相对应,本发明还公开一种基于UDP和组播的投屏直播***,请参阅图2,涉及主播端、组播服务器、接收端,所述***包括:
地址分配模块:通过组播服务器动态生成组播地址并根据接收端接入数量进行组播地址动态分配;
分片发送模块:主播端对待发送数据进行UDP分片并发送至组播服务器;
数据接收模块:接收端基于分配的组播地址监听并接收数据。
本发明还公开一种电子设备,包括:至少一个处理器、至少一个存储器、通信接口和总线;其中,所述处理器、存储器、通信接口通过所述总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令,以实现本发明前述的方法。
本发明还公开一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机实现本发明实施例所述方法的全部或部分步骤。所述存储介质包括:U盘、移动硬盘、只议存储器ROM、随机存取存储器RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的***实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以分布到多个网络单元上。本领域普通技术人员在不付出创造性的劳动的情况下,可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
以上所述仅为本发明的较佳实施方式而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。