本发明涉及数据通讯传输技术领域,尤其涉及一种低延时音视频传输方法、装置及计算机可读存储介质。
背景技术:
安防监控系统是以数字网络为传输介质、网络视频服务器核心,综合全面的使用数字视频处理技术、自动控制、网络传输技术和人工智能等技术,不仅有快速视频处理能力、数字信息抗干扰能力、便于快速查询记录等优点,而且依托网络,发挥宽带网络带来的优势,通过IP网络,把监控视频中心和能够连接网络的任何一个点进行互联结合,达到理想的闭路监控系统的远程、集中、实时效果。由于全数字化网络视频集中监控模式基于网络的特性,无须增加设备投资,网络上的远程或本地监控中心均可以实时监控、录像或任意回放一个或多个监控现场画面,授权的联网电脑也可以实现监控功能,避免了地理位置间隔原因造成监督管理的不便和缺位。
网络视频监控过程中,往往需要实现多个监控客户端和服务器之间的交互通信,监控客户端与服务器之间一般是采用利用基于TCP/IP进行网络通信,利用Socket通信编程接口编写程序,其目的是在TCP/IP所组建网络的不同机器之间利用客户/服务器模式建立通信连接。具体来说,在客户端利用基于TCP/IP和Socket通信编程的基本步骤是:①声明一个套接字类型的变量,需要在该变量定义中提供本机IP地址和通信端口并指明协议类型,由于在此介绍的是基于TCP/IP的套接字通信,因此协议类型应该是TCP/IP,在编程接口中该类型用AF-INET来表示;②向对方发出连接请求,连接时编程者需要提供对方TCP/IP地址和通信端口,同Socket实现程序自动向对提供本机TCP/IP地址和通信端口;③如果连接成功,会收到对方的应答信号,通信就可以通过套接字的相关操作来实现。利用Socket来实现服务器端通信软件的步骤是:①声明一个套接字类型的变量,需要在该变量定义中提供本机IP地址和通信端口并指明协议类型,由于在此介绍的是基于TCP/IP的套接字通信,因此协议类型应该是TCP/IP,在编程接口中该类型用AF-INET来表示;②服务器端通信软件进入等待客户端连接的状态,如果收到连接,则从对方连接请求中获取对方的IP地址和通信端口,并向对方发送连接成功的应答信号。
但是现有的Socket高并发技术多数还是采用多线程的同步技术,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个Socket句柄,每个Socket句柄同时也是一个文件句柄)。例如,每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听Socket,进程间通讯的unix域Socket等文件,那么剩下的可用于客户端Socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。“多线程同步”的通信方式是在进行网络操作的时候,主线程被挂起,主线程要等待网络操作完成之后,才能继续执行后续的代码,就是说要么执行主线程,要么执行网络操作;为了处理多个监控客户端的通信请求,一般通过对应每一监控客户端建立一线程,这样线程之间的切换将消耗大量的CPU资源,因此,现有的安防监控系统在音视频数据网络传输时,受最大连接数的限制问题和多线程同步时的阻塞问题,从而产生了延时缺陷。
技术实现要素:
本发明的主要目的在于提出一种低延时音视频传输方法、装置及计算机可读存储介质,旨在解决现有安防监控系统在音视频数据网络传输产生延时的技术问题。
为实现上述目的,本发明提供的一种低延时音视频传输方法,该方法包括以下步骤:
通过主线程创建一完成端口,并保存所述完成端口的句柄;
通过所述主线程建立多个工作者线程,用于处理音视频通信请求,实现与客户端通信;
当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定;
通过所述Socket向所述服务器提交音视频通信请求,所述工作者线程扫描所述完成端口的消息队列,从所述消息队列中调取并处理所述音视频通信请求。
进一步的,所述通过所述主线程建立多个工作者线程的具体步骤包括:
查询并获得所述服务器的CPU数量,对应所述CPU数量建立相同数量的所述工作者线程或者对应所述CUP数量建立两倍数量的所述工作者线程。
进一步的,所述当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定的具体步骤包括:
接收所述监控客户端的网络连接请求,将所述监控客户端的Socket中的设备句柄与所述完成端口进行绑定,并反馈一接收网络数据包的请求。
进一步的,所述从所述消息队列中调取并处理所述音视频通信请求的步骤之后,还包括:
所述工作者线程根据所述音视频通信请求执行后续线程后,在投递下一所述音视频通信请求。
进一步的,所述接收所述监控客户端的网络连接请求的步骤具体包括:
创建一用于监听的Socket,绑定到所述完成端口上,在指定所述完成端口上监听所述客户端的网络连接请求。
进一步的,所述接收所述监控客户端的网络连接请求的步骤具体包括:
创建一监听线程,利用Accept函数以普通阻塞方式接收所述监控客户端的Socket的网络连接请求,并把连入的所述Socket和所述完成端口绑定;
进一步的,所述接收所述监控客户端的网络连接请求的步骤具体包括:
通过所述完成端口异步调用AcceptEx函数接收所述监控客户端的Socket的网络连接请求,并把连入的所述Socket和所述完成端口绑定。
基于同一发明构思,本发明的另一方面,提供了一种低延时音视频传输装置,所述低延时音视频传输装置包括处理器、存储器及数据总线;
所述数据总线用于实现处理器和存储器之间的连接通信;
所述处理器用于执行存储器中存储的低延时音视频传输程序,以实现以下步骤:
通过主线程创建一完成端口,并保存所述完成端口的句柄;
通过所述主线程建立多个工作者线程,用于处理音视频通信请求,实现与客户端通信;
当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定;
通过所述Socket向所述服务器提交音视频通信请求,所述工作者线程扫描所述完成端口的消息队列,从所述消息队列中调取并处理所述音视频通信请求。
基于同一发明构思,本发明的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有低延时音视频传输程序,所述低延时音视频传输程序被处理器执行时实现上述的低延时音视频传输方法的步骤。
本发明技术方案的有益效果:
本发明提供的低延时音视频传输方法、装置及计算机可读存储介质,通过完成端口来事先建立多个工作者线程,首先是避免了线程的上下文切换,因为线程想要执行时,总有CPU资源可用,然后让这几个线程等着,等到有监控客户端的音视频通信请求来到时,就把这些音视频通信请求都加入到一个公共消息队列中去,然后这几个工作者线程就排队逐一去从消息队列中取出消息并加以处理,实现了异步通信和负载均衡的问题,采用多工作者进程自动调节的技术,有效的提高并发连接数;采用完成端口异步调用AcceptEx函数,利用事件触发的非阻塞异步模型,缩小了数据转发的延时时间。
附图说明
图1为本发明实施例提供的第一种低延时音视频传输方法流程框图;
图2为本发明实施例提供的第二种低延时音视频传输方法流程框图;
图3为本发明实施例提供的第一种低延时音视频传输装置结构框图;
图4为采用accept方式进行监控客户端接入的程序流程示意图;
图5为采用AcceptEx方式进行监控客户端接入的程序流程示意图;
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身没有特定的意义。因此,“模块”、“部件”或“单元”可以混合地使用。
实施例1
如图1所示,本发明实施例提供了一种低延时音视频传输方法,该方法包括以下步骤:
S101、通过主线程创建一完成端口,并保存所述完成端口的句柄;
S102、通过所述主线程建立多个工作者线程,用于处理音视频通信请求,实现与客户端通信;
S103、当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定;
S104、通过所述Socket向所述服务器提交音视频通信请求,所述工作者线程扫描所述完成端口的消息队列,从所述消息队列中调取并处理所述音视频通信请求。
其中,所述通过所述主线程建立多个工作者线程的具体步骤包括:
查询并获得所述服务器的CPU数量,对应所述CPU数量建立相同数量的所述工作者线程或者对应所述CUP数量建立两倍数量的所述工作者线程。
其中,所述当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定的具体步骤包括:
接收所述监控客户端的网络连接请求,将所述监控客户端的Socket中的设备句柄与所述完成端口进行绑定,并反馈一接收网络数据包的请求。
如图2所示,本发明实施提供的第二种低延时音视频传输方法,该方法包括以下步骤:
S201、通过主线程创建一完成端口,并保存所述完成端口的句柄;
S202、通过所述主线程建立多个工作者线程,用于处理音视频通信请求,实现与客户端通信;
S203、当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定;
S204、通过所述Socket向所述服务器提交音视频通信请求,所述工作者线程扫描所述完成端口的消息队列,从所述消息队列中调取并处理所述音视频通信请求。
S205、所述工作者线程根据所述音视频通信请求执行后续线程后,在投递下一所述音视频通信请求。
其中,所述接收所述监控客户端的网络连接请求的步骤具体包括:
创建一用于监听的Socket,绑定到所述完成端口上,在指定所述完成端口上监听所述客户端的网络连接请求。
其中,所述接收所述监控客户端的网络连接请求的步骤具体包括:
创建一监听线程,利用Accept函数以普通阻塞方式接收所述监控客户端的Socket的网络连接请求,并把连入的所述Socket和所述完成端口绑定;
其中,所述接收所述监控客户端的网络连接请求的步骤具体包括:
通过所述完成端口异步调用AcceptEx函数接收所述监控客户端的Socket的网络连接请求,并把连入的所述Socket和所述完成端口绑定。
实施例2
如图3所示,本发明实施例提供的一种低延时音视频传输装置硬件结构,具体地,所述低延时音视频传输装置30至少包括处理器31、存储器32以及数据总线33。数据总线33用于实现处理器31和存储器32之间的连接通信,存储器32作为一种计算机可读存储介质,可以存储至少一个计算机程序,这些计算机程序可供处理器31读取、编译并执行,从而实现对应的处理流程。在本实施例中,存储器32作为一种计算机可读存储介质,其中存储有低延时音视频传输程序,该程序可供处理器31执行,从而实现如下的低延时音视频传输方法的步骤:
通过主线程创建一完成端口,并保存所述完成端口的句柄;
通过所述主线程建立多个工作者线程,用于处理音视频通信请求,实现与客户端通信;
当监控客户端与服务器进行通信时,将监控客户端的Socket与所述完成端口进行绑定;
通过所述Socket向所述服务器提交音视频通信请求,所述工作者线程扫描所述完成端口的消息队列,从所述消息队列中调取并处理所述音视频通信请求。
另外,与实施例1的低延时音视频传输方法基于同一发明构思,本实施的低延时音视频传输装置中的低延时音视频传输程序还能够执行并实现实施例1所涉及的其他低延时音视频传输方法步骤,故本实施例不再赘述。
实施例3
基于同一发明构思,本发明的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有低延时音视频传输程序,所述低延时音视频传输程序被处理器执行时实现上述的低延时音视频传输方法的步骤。
如图4、5所示,分别是采用accept方式的流程示意图和采用AcceptEx方式的流程示意图,具体程序步骤包括:
调用CreateIoCompletionPort()函数创建一个完成端口,而且在一般情况下,我们需要且只需要建立这一个完成端口,把它的句柄保存好。
根据系统中有多少个CPU处理器,就建立多少个工作者(Worker)线程,这几个线程是专门用来和监控客户端进行通信的;可以采用启动一个独立的监听线程,专门用来accept监控客户端的连接请求;或者利用性能更高更好的异步AcceptEx()请求。
每当有监控客户端连入的时候,再次调用CreateIoCompletionPort()函数,把新连入的Socket(也就是前面的设备句柄),与目前的完成端口绑定在一起。
例如,监控客户端连入之后,我在这个Socket上提交一个网络请求,例如WSARecv(),然后系统去执行接收数据的操作;而此时,预先建立的几个Worker线程分别调用GetQueuedCompletionStatus()函数在扫描完成端口的消息队列里是否有音视频通信的请求存在(例如读取数据,发送数据等),若是则将这个请求从完成端口的消息队列中取回来,继续执行本线程中后面的处理代码,处理完毕之后,再继续投递下一个网络通信的请求,如此循环。
图4中是由_AcceptThread()负责接入连接,并把连入的Socket和完成端口绑定,另外的多个_WorkerThread()就负责监控完成端口上的情况,一旦有情况,就取出来处理,如果CPU有多核的话,就可以多个工作者线程轮着来处理完成端口上的信息。
图5中取消了阻塞方式的accept调用,也就是说,AcceptEx也是通过完成端口来异步完成的,所以就取消了专门用于accept连接的线程,用了完成端口来进行异步的AcceptEx调用;然后在检索完成端口队列的Worker函数中,根据用户投递的完成操作的类型,再来找出其中的投递的Accept请求,加以对应的处理。
AcceptEx是在客户端连入之前,就把客户端的Socket建立完成,也就是说,AcceptEx是先建立的Socket,然后才发出的AcceptEx调用,在进行客户端的通信之前,无论是否有客户端连入,Socket都是提前建立完成;而不需要像accept是在客户端连入了之后,再现场去建立Socket。
相比accept只能阻塞方式建立一个连入的入口,对于大量的并发客户端来讲,显得拥挤;而AcceptEx可以同时在完成端口上投递多个请求,这样有客户端连入的时候,能从容不迫的处理连入请求。
在投递AcceptEx时,可以顺便在AcceptEx的同时,收取客户端发来的第一组数据,这个是同时进行的,收到AcceptEx完成的通知时,已经把这第一组数据接完毕;但是,如果客户端只是连入但是不发送数据时,就不会收到这个AcceptEx完成的通知。
本发明提供的低延时音视频传输方法、装置及计算机可读存储介质,通过完成端口来事先建立多个工作者线程,首先是避免了线程的上下文切换,因为线程想要执行时,总有CPU资源可用,然后让这几个线程等着,等到有监控客户端的音视频通信请求来到时,就把这些音视频通信请求都加入到一个公共消息队列中去,然后这几个工作者线程就排队逐一去从消息队列中取出消息并加以处理,实现了异步通信和负载均衡的问题,采用多工作者进程自动调节的技术,有效的提高并发连接数;采用完成端口异步调用AcceptEx函数,利用事件触发的非阻塞异步模型,缩小了数据转发的延时时间。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。