本发明涉及计算机技术领域,特别是涉及一种视频编解码的方法与装置。
背景技术:
随着互联网和移动互联网的高速发展,人们产生的数据总量呈现急剧增长的趋势。信息数据越来越多,对信息数据处理能力的要求也越来越高,尤其在视频领域,随着互联网、智慧城市的飞速发展,有越来越多的视频数据需要被存储、传输和处理,这其中会涉及到大量的视频编码和解码,简称视频编解码。
视频编解码技术是网络电视发展的最初条件,高效的视频编码才能保证在现实的互联网环境下提供视频服务。一种可行的方式,视频编解码可以由中央处理器(CPU)一手包办的,但是由于CPU的编解码能力有限,所以在解码高清电影时相当吃力。
图像处理器(Graphics Processing Unit,GPU),又称显示核心,是一种专门在个人电脑、工作站、游戏机和一些移动设备上图像运算工作的微处理器。可以用于将计算机系统所需要显示信息进行转换驱动,并向显示器提供扫描信号,控制显示器的正确显示。GPU的浮点运算能力远远强于CPU,因此由GPU来处理高清视频的解码工作,能够极大的降低CPU的负担,提升视频编解码的工作效率。但是,传统方式中,GPU只能对视频流进行串行处理,无法对大规模的视频流数据进行多路编解码,导致视频编解码工作效率低下。
可见,如何提升视频编解码的工作效率,是本领域技术人员亟待解决的问题。
技术实现要素:
本发明实施例的目的是提供一种视频编解码的方法与装置,可以对大规模的视频数据进行多路编解码,有效提升视频编解码的工作效率。
为解决上述技术问题,本发明实施例提供一种视频编解码的方法,应用于包含至少一个GPU的服务器,所述方法包括:
依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程;
对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。
可选的,还包括:
依据设置的动态负载均衡规则,向所述至少一个GPU分配所述多路视频流。
可选的,还包括:
在所述GPU上设置每个线程相对应的第一缓冲区和第二缓冲区;所述第一缓冲区用于存储待解码的视频流数据;所述第二缓冲区用于存储解码后的视频流数据。
可选的,所述对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理包括:
利用ffmpeg库函数对所述多路视频流进行解析,获取所述视频流的参数信息;所述参数信息包括:解码格式、分辨率、颜色和大小;每路视频流经过解析后得到对应的至少一个数据包;
依据所述参数信息,设置解码规则;
将所述至少一个数据包写入第一缓冲区;
调用所述GPU依据所述解码规则,对所述至少一个数据包进行解码操作,得到所述至少一个数据包相对应的至少一个帧;并将所述至少一个帧存储于所述第二缓冲区;
调用所述GPU依据于预先设置的编码规则,对所述第二缓冲区的所述至少一个帧进行编码操作。
可选的,还包括:
为所述至少一个线程设置相对应的互斥锁;所述互斥锁用于保证同一时刻只有一个线程调用所述GPU。
可选的,还包括:
为所述至少一个GPU设置相对应的互斥锁;所述互斥锁用于保证同一时刻只为一个GPU分配多路视频流。
本发明实施例还提供一种视频编解码的装置,应用于包含至少一个GPU的服务器,所述装置包括设置单元和处理单元:
所述设置单元,用于依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程;
所述处理单元,用于对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。
可选的,还包括分配单元:
所述分配单元,用于依据设置的动态负载均衡规则,向所述至少一个GPU分配所述多路视频流。
可选的,所述设置单元还用于在所述GPU上设置每个线程相对应的第一缓冲区和第二缓冲区;所述第一缓冲区用于存储待解码的视频流数据;所述第二缓冲区用于存储解码后的视频流数据。
可选的,所述处理单元包括解析子单元、设置子单元、写入子单元、解码子单元和编码子单元:
所述解析子单元,用于利用ffmpeg库函数对所述多路视频流进行解析,获取所述视频流的参数信息;所述参数信息包括:解码格式、分辨率、颜色和大小;每路视频流经过解析后得到对应的至少一个数据包;
所述设置子单元,用于依据所述参数信息,设置解码规则;
所述写入子单元,用于将所述至少一个数据包写入第一缓冲区;
所述解码子单元,用于调用所述GPU依据所述解码规则,对所述至少一个数据包进行解码操作,得到所述至少一个数据包相对应的至少一个帧;并将所述至少一个帧存储于所述第二缓冲区;
所述编码子单元,用于调用所述GPU依据于预先设置的编码规则,对所述第二缓冲区的所述至少一个帧进行编码操作。
可选的,所述设置单元还用于为所述至少一个线程设置相对应的互斥锁;所述互斥锁用于保证同一时刻只有一个线程调用所述GPU。
可选的,所述设置单元还用于为所述至少一个GPU设置相对应的互斥锁;所述互斥锁用于保证同一时刻只为一个GPU分配多路视频流。
由上述技术方案可以看出,在服务器中可以同时安装多个GPU,对于每个GPU而言,可以依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程;对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。可见,一个线程通过调用GPU可以实现对解析后一路视频流的编解码处理,一个GPU对应的可以设置多个线程,即该多个线程可以同时调用GPU对解析后的视频流进行处理,从而实现一个GPU对多路视频流的并行处理,有效的提升了视频编解码的工作效率。
附图说明
为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种视频编解码的方法的流程图;
图2为本发明实施例提供的另一种视频编解码的方法的流程图;
图3为本发明实施例提供的一种视频编解码的装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本发明保护范围。
为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。
接下来,详细介绍本发明实施例所提供的一种视频编解码的方法。图1为本发明实施例提供的一种视频编解码的方法的流程图,应用于包含至少一个GPU的服务器,所述方法包括:
S101:依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程。
线程可以理解为是调用GPU实现编解码的接口信息,利用该线程便可以调用GPU实现是对视频流的编解码。线程池可以用于存储线程,一个线程池中存储的线程的个数可以根据用户的要求进行设置。
在本发明实施例中,可以在服务器中设置至少一个GPU,每个GPU对应有一个线程池,每个线程池可以设置有至少一个线程。一个线程池中设置有几个线程,对应的便可以同时对几路视频流进行处理。
其中,线程池中包括的线程的个数可以由用户通过相关的界面输入到服务器中,该个数的具体数值可以依据于一个GPU的处理能力确定,例如,一个GPU的运算能力,可以同时对10路视频流进行处理,则可以将线程池中的线程个数设置为10个。
需要说明的是,每个GPU对应的线程池包含的线程的个数可以相同,也可以不同,在此不做限定。
S102:对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。
通过线程调用GPU对视频流进行编解码处理时,以多线程为例,每个线程对应的是一路视频流,在具体实现中,线程在调用GPU对视频流编解码处理时,为了提升编解码的工作效率,会将视频流进行解析处理,经过处理后的视频流相当于被切分成更小的组成单元,以数据包的形式存在,也即一路视频流可以包含至少一个数据包。GPU对多路视频流进行编解码的处理时,每路视频流被切分成至少一个数据包,为了便于管理每路视频流对应的数据包,可以针对每个线程设置对应的缓冲区,具体的,可以在所述GPU上设置每个线程相对应的第一缓冲区和第二缓冲区;所述第一缓冲区用于存储待解码的视频流数据;所述第二缓冲区用于存储解码后的视频流数据。
需要说明的是,待解码的视频流数据可以是经过解析处理后的视频流,此时该数据流是以数据包的形式存储,同理,解码后的视频流数据可以是以解码后的数据形式存储,一般情况下,经过解码处理后的视频流会以帧的形式存储。
接下来,将对视频流的具体编解码处理过程展开介绍,如图2所示,该步骤包括:
S201:利用ffmpeg库函数对所述多路视频流进行解析,获取所述视频流的参数信息。
S202:依据所述参数信息,设置解码规则。
对视频流进行编码的方式有多种,每种编码方式有其对应的解码方式。在对视频流进行解码时,需要知道该视频流采用的是哪种编码方式,以及视频流的分辨率、颜色和大小等因素,GPU无法自动识别这些参数信息,故此,线程在调用GPU进行解码处理之前,需要获取这些参数信息,参数信息可以包括:解码格式、分辨率、颜色和大小等。编解码的主要作用是对视频流进行压缩和解压缩,解码格式可以用于表示视频流采用何种方式进行解压缩。将这些参数信息按照一定的格式要求进行整理,得到解码规则。解码规则可以用于表示对视频流进行解码的要求。
S203:将所述至少一个数据包写入第一缓冲区。
一个线程可以用于对一路视频流进行处理,每个线程有其对应的一组缓冲区(第一缓冲区和第二缓冲区),每路视频流都有对应的第一缓冲区存储经过解析后得到的至少一个数据包。
S204:调用所述GPU依据所述解码规则,对所述至少一个数据包进行解码操作,得到所述至少一个数据包相对应的至少一个帧;并将所述至少一个帧存储于所述第二缓冲区。
依据该解码规则,便可以设置视频解码库(CUVID)的相关结构,从而使得GPU可以实现对数据包的解码处理。在具体实现中,对数据包进行解码处理时,涉及三个回调函数(callback function),分别为格式变更回调函数(format change callback)、解码回调函数(decode callback)和显示回调函数(display callback),格式变更回调函数主要用于当视频流的格式发生变化时被调用,对于一些网络突发状况,可能会导致视频流的格式发生变化,对于该种情况,可以调用该格式变更回调函数,将改变的视频流的格式变为原来的格式。解码回调函数可以用于对数据包的解码,解码后的数据包可以以帧的形式存在,显示回调函数可以用于帧的显示或存储。
对于解码后得到的帧可以将其存储于第二缓冲区,以便于后续对其进行二次编码处理。
S205:调用所述GPU依据于预先设置的编码规则,对所述第二缓冲区的所述至少一个帧进行编码操作。
在实际应用中,服务器接收的视频流可能是MP4的格式,若想要将该视频流变为AVI格式,可以对该视频流进行解码后,再进行二次编码时可以以AVI格式的编码规则进行,从而实现该视频流格式的变更。故此,可以预先设置好编码规则,以便于二次编码时可以依照该编码规则,编码成符合用户需求的视频流格式。
以服务器中包含有多个GPU为例,服务器在接收到视频流后,需要将视频流进行分配,具体的,可以预先设置相应的动态负载均衡规则,使得服务器在接收到多路视频流后,可以依据设置的动态负载均衡规则,向所述至少一个GPU分配所述多路视频流。
动态负载均衡规则可以用于保证每个GPU都被均衡的使用。
在该动态负载均衡规则中,可以设置首次分配时向每个GPU分配的视频流的路数,例如,首次分配时,可以向每个GPU分配20路视频流。对于不同的视频流,GPU完成编解码的时间不尽相同,对于后续分配视频流时,动态负载均衡规则可以是根据每个GPU的处理情况,进行动态的分配,例如,在服务器中安装有3个GPU,分别为GPU1、GPU2和GPU3,首次分配时向每个GPU分配了20路视频流,GPU1可能最先处理好分配的20路视频流,此时依据该动态负载均衡规则,可以向GPU1再分配20路视频流。
针对上述在一台服务器上设置多个GPU的情况,在向GPU分配视频流时,为了避免各个GPU之间产生相互影响,可以对于每个GPU设置对应的一个互斥锁,所述互斥锁用于保证同一时刻只为一个GPU分配多路视频流。
考虑到一个GPU对应的线程池中可以包含有多个线程,为了避免各个线程之间产生相互影响,可以为每个线程设置相对应的互斥锁;所述互斥锁用于保证同一时刻只有一个线程调用所述GPU。
由上述技术方案可以看出,在服务器中可以同时安装多个GPU,对于每个GPU而言,可以依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程;对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。可见,一个线程通过调用GPU可以实现对解析后一路视频流的编解码处理,一个GPU对应的可以设置多个线程,即该多个线程可以同时调用GPU对解析后的视频流进行处理,从而实现一个GPU对多路视频流的并行处理,有效的提升了视频编解码的工作效率。
图3为本发明实施例提供的一种视频编解码的装置的结构示意图,应用于包含至少一个GPU的服务器,所述装置包括设置单元31和处理单元32:
所述设置单元31,用于依据用户输入的线程个数信息,在所述GPU对应的线程池中设置多个线程。
所述处理单元32,用于对接收到的多路视频流进行解析处理,并利用所述多个线程调用所述GPU对所述解析处理后的多路视频流进行编解码处理。
可选的,还包括分配单元:
所述分配单元,用于依据设置的动态负载均衡规则,向所述至少一个GPU分配所述多路视频流。
可选的,所述设置单元还用于在所述GPU上设置每个线程相对应的第一缓冲区和第二缓冲区;所述第一缓冲区用于存储待解码的视频流数据;所述第二缓冲区用于存储解码后的视频流数据。
可选的,所述处理单元包括解析子单元、设置子单元、写入子单元、解码子单元和编码子单元:
所述解析子单元,用于利用ffmpeg库函数对所述多路视频流进行解析,获取所述视频流的参数信息;所述参数信息包括:解码格式、分辨率、颜色和大小;每路视频流经过解析后得到对应的至少一个数据包。
所述设置子单元,用于依据所述参数信息,设置解码规则。
所述写入子单元,用于将所述至少一个数据包写入第一缓冲区。
所述解码子单元,用于调用所述GPU依据所述解码规则,对所述至少一个数据包进行解码操作,得到所述至少一个数据包相对应的至少一个帧;并将所述至少一个帧存储于所述第二缓冲区。
所述编码子单元,用于调用所述GPU依据于预先设置的编码规则,对所述第二缓冲区的所述至少一个帧进行编码操作。
可选的,所述设置单元还用于为所述至少一个线程设置相对应的互斥锁;所述互斥锁用于保证同一时刻只有一个线程调用所述GPU。
可选的,所述设置单元还用于为所述至少一个GPU设置相对应的互斥锁;所述互斥锁用于保证同一时刻只为一个GPU分配多路视频流。
图3所对应实施例中特征的说明可以参见图1和图2所对应实施例的相关说明,这里不再一一赘述。
以上对本发明所提供的一种视频编解码的方法与装置进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。