发明内容
为了解决上述技术问题,本发明提供一种视频流传输方法和装置,该方法和装置可以用于媒体转发服务端或客户端,也可以在媒体转发服务器端和客户端同时使用。
根据本发明的第一方面,本发明提供一种视频流传输方法,该方法用于媒体转发服务器,包括如下步骤:
S11、初始化环境;
S12、创建UDP套接口;
S13、向所创建的套接口写数据;
S14、在视频转发服务器中,内核检查套接口写数据是否写入成功。如果写入成功,则继续执行步骤S13,对套接口继续写数据。如果写入不成功,则执行步骤S15;
S15、设置一个阈值,检查写数据连续不成功的累计次数是否超过该阈值,如果检查结果是未超过阈值,则继续执行步骤S13,对套接口继续写数据;如果检查结果是超过阈值,则继续执行步骤S16;
S16、将这路视频流的套接口关闭,不再发送视频流。
优选的,在步骤S14中,内核检查套接口写数据是否写入成功是通过检查是否存在立即可知的错误,如果不存在该错误,则数据写入成功,如果存在该错误,则数据写入不成功。
根据本发明的第二方面,本发明提供一种视频流传输方法,该方法用于客户端,包括如下步骤:
S21、初始化环境,创建UDP套接口;
S22、当尚未有视频流到达客户端的UDP套接口时,套接口处于阻塞状态;当有视频流到达时,客户端的接收进程从UDP套接口中接收数据,即读取数据;
S23、客户端的接收进程从所接收到的数据里解析出视频流的源IP地址和端口号,并将UDP套接口和源IP地址和端口进行连接,同时将UDP套接口设置为非阻塞。此时该UDP套接口只接收来自该源的视频流,来自其他IP地址和端口的视频流将会被丢弃。
S24、客户端的接收进程继续对该UDP套接口读取数据,检查是否读取成功,如果对套接口读取数据成功,则数据接收成功;如果读取不成功,则继续执行步骤S25;
S25、设置一个阈值,检查数据读取连续不成功的累计次数是否超过该阈值,如果检查结果是超过阈值,则认为从该源发过来的流已结束,执行步骤S26;如果检查结果是未超过阈值,则执行步骤S24,对套接口继续读数据;
S26、将这路视频流的套接口关闭,执行步骤S21,创建新的UDP套接口,等待新的视频流。
优选的,在步骤S24中,内核检查套接口读数据是否读取成功是通过检查是否存在立即可知的错误,如果不存在该错误,则数据读取成功,如果存在该错误,则数据读取不成功。
优选的,所述立即可知的错误是由已连接的UDP套接口引发的异步错误。
优选的,所述阈值的大小由现场的网络环境实际情况和用户的需求来定,阈值可以为0。
根据本发明的第三方面,本发明提供一种媒体转发服务器的视频流传输装置,包括:初始化环境的单元;创建UDP套接口的单元;向所创建的UDP套接口写数据的单元;内核,检查套接口写数据是否写入成功,如果写入成功,则继续向所创建的UDP套接口写数据,如果写入不成功,则检查写数据连续不成功的累计次数是否超过预设的阈值;检查写数据连续不成功的累计次数是否超过该阈值的单元,如果检查结果是未超过该阈值,则继续向所创建的UDP套接口写数据,如果检查结果是超过该阈值,则将这路视频流的套接口关闭;其中所述阈值是根据现场网络环境情况设置的;将这路视频流的套接口关闭,不再发送视频流的单元。
根据本发明的第四方面,本发明提供一种客户端的视频流传输装置,包括:初始化环境,创建UDP套接口的单元;数据读取单元,当尚未有视频流到达客户端的UDP套接口时,套接口处于阻塞状态,当有视频流到达时,客户端的接收进程从UDP套接口中接收数据,即读取数据;客户端的接收进程从所接收到的数据里解析出视频流的源IP地址和端口号,并将UDP套接口和源IP地址和端口进行连接,同时将UDP套接口设置为非阻塞的单元,其中,该UDP套接口只接收来自该源的视频流,来自其他IP地址和端口的视频流将会被丢弃;内核,检查套接口读数据是否读取成功,如果对套接口读取数据成功,则数据接收成功,如果读取不成功,则检查数据读取连续不成功的累计次数是否超过预设的阈值;检查数据读取连续不成功的累计次数是否超过该阈值的单元,如果检查结果是超过阈值,则认为从源发过来的流已结束,将这路视频流的套接口关闭,如果检查结果是未超过阈值,则对套接口继续读数据,其中,所述阈值是根据现场网络环境情况设定的;将这路视频流的套接口关闭,并创建新的UDP套接口,等待新的视频流的单元。
本发明的上述方法和装置有效解决了现有技术所存在的技术问题,不仅代替了现有技术中的心跳保活机制,有效避免了视频串流、重流等现象,而且在客户端为解码器时,也可以实现视频流两端的稳定性。同时,本发明的上述方法和装置降低了视频流传输中的开销,提高了视频流传输的性能。
本发明的视频流传输方法和装置既可以用于服务器,也可以用于客户端,最好是在服务器和客户端同时使用。单独在服务器端使用可以检测到设备掉线,实现自动断流,减少带宽压力和出现串流、重流的几率;单独在客户端上使用可以实现每次只接收一个源的视频流,从而消除重流的现象。一起使用效果更佳。
具体实施方式
下面结合附图,通过具体实施例对本发明的视频流传输方法展开详述,以下实施例只是描述性的,不是限定性的,因此不能以此限定本发明的保护范围。
在本发明中,客户端和解码器都是广义上的客户端,即术语“客户端”包括客户端和解码器及类似的各种终端设备。本申请背景技术部分之所以区分客户端和解码器,是因为在现有的心跳保活机制下,二者实现视频流两端的稳定性能力是不同的,而运用本发明的视频流传输方法,二者是没有区别的。
参看图3,图3是根据本发明的视频流传输方法示意图。客户端发送信令到信令服务器,请求视频流,信令服务器将信令转发给媒体服务器,媒体服务器根据信令的请求将视频流发送给客户端,即在媒体转发服务器和客户端之间实现已连接的视频流。当客户端出现崩溃的情况后,客户端重启,然后重新请求视频流,此时来自于媒体转发服务器的视频流A和来自于任何其他IP或端口的视频流B会同时到达客户端。
在本实施方式中,以客户端实施本发明的视频流传输方法为例进行说明。此时,客户端经由UDP套接口接收视频流A或B(本文为了叙述方便,假设客户端接收的是视频流A)。先从视频流A中解析出这个视频流A的IP地址和端口,然后连接所解析出的IP地址和端口,并设置该套接口为非阻塞。
在本发明的实施方式中,来自任何其他IP或端口的视频流B也被投递给上述客户端上的UDP套接口,由于该UDP套接口已经开始接收视频流A,则没有相匹配的UDP套接口来接收视频流B,该UDP套接口将丢弃它们并生成相应的资源暂时不可用的错误信息,并将该错误信息发送给该视频流B的发送进程。
上述资源暂时不可用的错误(在本实施方式中为异步错误)是网络由于具有延时的特殊性而在数据传输的过程中产生的问题,在现有技术中,内核是忽略这部分错误的,即视频流B的发送进程不检测该错误信息,而在接收到该错误信息是将其直接丢弃。
也就是说,在上述视频流B的发送进程接收到上述错误信息后,如果视频流B的源端(媒体转发服务器)未实施本发明的视频流传输方法,则会丢弃该错误信息。
如果视频流B的源端(媒体转发服务器)实施了本发明的视频流传输方法,则收集该错误信息,用于检测其UDP套接口写数据是否写入成功(下文中将详述)。
由于网络环境不稳定也会导致这种错误信息出现,因此可以设置一个阈值,用该阈值来避免因现场网络环境因素出现的错误。具体而言,根据网络环境设置一个阈值,当资源暂时不可用的错误信息连续出现的次数累计超过预设的阈值时,客户端将不再接收视频流B。
当视频流A发送结束后,客户端UDP套接口由于是非阻塞的,依然在重复读取,这时候客户端的UDP套接口就产生了资源暂时不可用的错误信息,同样,当这个信息连续出现的次数超出了预设的阈值时,将客户端的该UDP套接口关闭,重新创建一个UDP套接口来接收数据,并将新建的UDP套接口设置为阻塞,以准备接收下一个视频流的到来。
在本实施方式中,为了叙述方便,假设了客户端崩溃重启之后同时接收到了视频流A和B,事实上,也有可能是更多的视频流同时发送到客户端。对于媒体转发服务器而言,如果设备没有启动成功,同样也会接收到资源暂时不可用的错误信息,当错误信息连续出现的次数累计超过预设的阈值时,关闭视频流,从而减小了网络传输的压力。
下面将参照图4和图5详细说明本发明的视频流传输的具体流程。
图4是本发明的服务器端的视频流传输方法流程图。如图4所示,服务器端的视频流传输方法包括如下步骤:
S11、媒体转发服务器初始化环境。
S12、先创建UDP套接口,连接目标的IP地址和端口。
S13、媒体转发服务器向所创建的套接口写数据。
S14、在视频转发服务器中,检查套接口写数据是否写入成功。如果写入成功,则继续执行步骤S13,对套接口继续写数据。如果写入不成功,则执行步骤S15。
当UDP套接口连接一个目标的IP地址和端口后,内核会发现存在立即可知的错误(包括加入发送队列产生的实时错误,和由于网络原因产生的滞后的异步错误)。并且,内核会记录请求视频流的目标客户端的IP地址和端口号。
媒体转发服务器一边向套接口写数据,一边检查是否存在错误。
在本发明的实施方式中,转发进程通过查看系统全局的错误变量对这个错误进行检查。这样做的结果就是能够使由已连接的UDP套接口引发的异步错误返回给它们所在的进程。
上述异步错误是网络由于具有延时的特殊性而在数据传输的过程中产生的问题,在UDP套接口的一般应用时(现有技术中),内核是忽略这部分错误的。而本发明利用该异步错误来检查套接口写数据是否写入成功,结合下文将详述的阈值来决定是否将该路视频流的UDP套接口关闭,从而避免现有技术中的问题。
S15、检查上述错误信息连续出现的累计次数是否超过阈值。其中的阈值是根据现场网络环境情况预先设定的,用来排除因网络环境不好发送误判的可能。如果检查结果是超过阈值,则执行步骤S16。如果检查结果是未超过阈值,则继续执行步骤S13,对套接口继续写数据。
在本实施方式中,阈值的大小由现场的网络实际情况和用户的需求来定,比如现场的网络经常出现丢包,网络阻塞的现象,可能会经常出现这个错误,而用户觉得这个是可以容忍的,我们就把这个连续出现错误的次数的上限作为阈值。简单的说,阈值就是视频可中断的时间,值越大,时间也就越长,但对于客户端来说,两个视频流的之间的正常的切换时间可能是很短的,我们甚至可以在此处把阈值设为0。
S16、将这路视频流的套接口关闭,不再发送视频流。
图5是本发明的客户机端的视频流传输方法流程图。如图5所示,客户端的视频流传输方法包括如下步骤:
S21、客户端启动,并初始化环境,创建UDP套接口。
S22、当尚未有视频流到达客户端的UDP套接口时,套接口处于阻塞状态。当有视频流到达时,客户端的接收进程从UDP套接口中接收数据,即读取数据。
S23、客户端的接收进程从所接收到的数据里解析出视频流的源IP地址和端口号,并将UDP套接口和源地址端口进连接,同时将UDP套接口设置为非阻塞。此时该UDP套接口只接收来自源的视频流,来自其他IP地址和端口的视频流将会被丢弃。
S24、客户端的接收进程继续对该UDP套接口读取数据,内核检查是否存在立即可知的错误。此时套接口是非阻塞的。如果没有发现错误,则意味着对套接口读取数据成功,即数据接收成功。如果发现错误,则意味着对套接口读取数据失败,此时继续执行步骤S25。
在本实施方式中,客户端的内核记录了视频流的源IP地址和端口号,当有其他的视频流也发送到这个套接口的时候,由于没有相匹配的IP和端口号,UDP将丢弃它们并生成相应的端口不可达的错误,即上述立即可知的错误。
S25、对返回的错误信息的次数进行计数,检查返回错误信息的累计次数是否超过阈值。该阈值是根据现场网络环境情况设定的,用来排除因网络环境不好发送误判的可能。如果检查结果是超过阈值,则认为从源发过来的流已结束,执行步骤S26。如果检查结果是未超过阈值,则继续执行步骤S24,对套接口继续读数据。
阈值的大小可以采用上文所述的方式进行设定。
S26、将这路视频流的套接口关闭。然后,执行步骤S21,创建一个UDP套接口(初始状态为阻塞),等待着下一个视频流。
由于当应用进程知道自己要给同一宿主地址发送多个数据报时,显式连接套接口更加有效率。所以,执行了本发明的上述实施方式的方法在一个未连接的UDP套接口上给两个数据报调用write函数时,内核执行如下步骤:1、连接套接口;2、输入第一个数据报;3输入第二个数据报。也就是说,在这种情况下,内核只拷贝一次含有宿主IP地址和端口后的套接口地址结构。而在一个未连接的UDP套接口上给两个数据报调用sendto函数时,需要拷贝两次。这样,临时连接未连接的UDP套接口将耗费每个UDP传输三分之一的开销,显著节省了UDP传输的开销,提高了传输的效率。
与上述应用于媒体转发服务器的视频流传输方法相应的,本发明还提供一种媒体转发服务器的视频流传输装置,包括:初始化环境的单元;创建UDP套接口的单元;向所创建的UDP套接口写数据的单元;内核,检查套接口写数据是否写入成功,如果写入成功,则继续向所创建的UDP套接口写数据,如果写入不成功,则检查写数据连续不成功的累计次数是否超过预设的阈值;检查写数据连续不成功的累计次数是否超过该阈值的单元,如果检查结果是未超过该阈值,则继续向所创建的UDP套接口写数据,如果检查结果是超过该阈值,则将这路视频流的套接口关闭;其中所述阈值时根据现场网络情况设置的;将这路视频流的套接口关闭,不再发送视频流的单元。
与上述应用于客户端的视频流传输方法相应的,本发明还提供一种客户端的视频流传输装置,包括:初始化环境,创建UDP套接口的单元;数据读取单元,当尚未有视频流到达客户端的UDP套接口时,套接口处于阻塞状态,当有视频流到达时,客户端的接收进程从UDP套接口中接收数据,即读取数据;客户端的接收进程从所接收到的数据里解析出视频流的源IP地址和端口号,并将UDP套接口和源IP地址和端口进行连接,同时将UDP套接口设置为非阻塞的单元,其中,该UDP套接口只接收来自该源的视频流,来自其他IP地址和端口的视频流将会被丢弃;内核,检查套接口读数据是否读取成功,如果对套接口读取数据成功,则数据接收成功,如果读取不成功,则检查数据读取连续不成功的累计次数是否超过预设的阈值;检查数据读取连续不成功的累计次数是否超过该阈值的单元,如果检查结果是超过阈值,则认为从源发过来的流已结束,将这路视频流的套接口关闭,如果检查结果是未超过阈值,则对套接口继续读数据,其中,所述阈值是根据现场网络情况设定的;将这路视频流的套接口关闭,并创建新的UDP套接口,等待新的视频流的单元。
与本发明的特定方面、实施方式或示例协同描述的特征、整体、特点或分组应当被理解为能够应用于这里描述的其他方面、实施方式或示例中,除非与之不可兼容。本说明书(包括任何所附权利要求书、摘要和附图)中披露的所有特征,和/或所披露的任何方法或流程中的全部步骤,都可以以任何组合来合并,除非组合中的至少部分特征和/或步骤是互斥的。本发明不局限于任何前述实施方式的任何细节。本发明扩展到本说明书(包括任何附加权利要求书、摘要和附图)中所披露的任何一个新颖的特征或者新颖的特征组合,或者扩展到所披露的任何方法的任何一个新颖的步骤或者新颖的步骤组合。