一种基于golang的高并发信号处理平台的制作方法

未命名 08-13 阅读:75 评论:0


1.本发明属于视频监控领域,尤其是涉及一种基于golang的高并发信号处理平台。


背景技术:

2.在视频监控领域,对于视频的处理与协调是非常重要的一环,尤其是直播过程中,更需要对信号以及现场数据有着快速的反应,同时需要对视频进行快速处理,现有技术往往需要耗费大量的时间和计算资源,由于传统的视频处理技术采用多线程或者分布式系统来支持高并发处理,因此其内存消耗非常庞大;从而导致了现有技术很难在短时间内完成对大量视频数据的处理,并且经常需要使用专门的集群环境才能够支撑大规模的视频处理需求,导致后台往往需要非常多的工作人员对视频进行处理,工作效率低,耗费大量人力成本,且需要高额的维护成本。


技术实现要素:

3.有鉴于此,本发明旨在提出一种基于golang的高并发信号处理平台,以期解决上述部分技术问题中的至少之一。
4.为达到上述目的,本发明的技术方案是这样实现的:本发明第一方面提供了,一种基于golang的高并发信号处理平台,包括视频处理模块、弹幕渲染模块、并发协调模块;视频处理模块通过ffmpeg记录和转换数字音频和视频,并将数字音频和视频转化为流数据;视频处理模块使用goroutine对多个任务进行多线程处理;视频处理模块将一些常用的资源存储至内存中,进行复杂操作前,通过操作系统进行预先提取;弹幕渲染模块内存储有,对原始弹幕进行预先处理后得到的弹幕图片,当用户输入弹幕时,将弹幕图片投放至视频流中;并发协调模块使用mq工具将任务按照优先级分配到不同的队列中,通过golang的协程池来消费,消息队列中的任务。
5.进一步的,视频处理模块使用ffmpeg处理数据的过程如下:a1、视频编码和解码:打开指定的输入文件,调用ffmpeg方法库创建一个newtranscoder对象,并将视频解码器转换为h264编码后开始转码;a2、剪裁视频:打开指定的输入文件,创建一个新的filter对象作为过滤器,创建一个新的输出文件开始剪裁操作;a3、合并视频:打开需要合并的多个输入文件,创建一个新的transcoder对象作为转码器,定义一个输出选项结构体来配置输出格式和合并选项,创建一个新的输出文件进行开始合并操作。
6.进一步的,视频处理模块进行多线程处理的过程如下:
读取输入视频文件列表中的所有mp4视频文件,对于视频文件列表中的每一个视频文件,都使用goroutine并发执行转码任务,等待所有goroutine执行完毕之后,结束程序。
7.进一步的,视频处理模块进行预处理操作的过程如下:将要提取的资源文件加载到内存中的缓冲区并存储,在应用程序启动时,使用操作系统的i/o操作从磁盘上提取资源到内存中,并保留在内存中,当需要更改或访问某个图像资源时,从内存中获取相应的缓存,并进行操作。
8.进一步的,弹幕渲染模块进行预处理操作的过程如下:根据原始弹幕的文字内容,使用一些图形库或字体渲染技术将其渲染成图片;将弹幕图片的背景设置为透明,以免遮挡住其他内容;对弹幕图片进行压缩处理;弹幕渲染模块进行弹幕投放的过程如下:根据视频内容和当前时间等因素计算出新弹幕图片应该在视频中出现的位置;控制当前弹幕的总数量,规定弹幕速度和密度;根据计算出的弹幕位置和已有弹幕的状态信息,将弹幕图片添加到视频流中。
9.进一步的,并发协调模块进行高并发处理的过程如下:选择rabbitmq作为消息队列工具,设计任务结构,包括任务类型、优先级、执行参数;使用golang实现并发协调模块,利用协程池控制并发数量;根据任务的优先级,在消息队列中创建不同的队列;进一步的,在服务器端,将任务按照优先级分配到对应的队列中;在客户端,根据队列中的任务启动golang协程,并从协程池中分配协程执行任务。
10.本发明第二方面提供了,一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,其特征在于:所述处理器用于执行上述第一方面任一所述的一种基于golang的高并发信号处理平台。
11.本发明第三方面提供了,一种服务器,其特征在于:包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行如第一方面任一所述的一种基于golang的高并发信号处理平台。
12.本发明第四方面提供了,一种计算机可读取存储介质,存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现第一方面任一项所述的一种基于golang的高并发信号处理平台。
13.相对于现有技术,本发明所述的一种基于golang的高并发信号处理平台具有以下有益效果:本发明所述的一种基于golang的高并发信号处理平台:具有高并发处理能力:轻松地实现高效的并发控制和协程调度。
14.内存消耗低:由于golang语言采用基于并发和通信的轻量级机制,因此其内存消耗较低,能够较好地支持高并发处理任务。
15.跨平台支持:golang具有跨平台的特性,能够支持多种不同操作系统和硬件架构下的视频处理需求,从而提高了其应用范围。
16.运行速度快:golang编译生成的二进制文件具有高速执行和低资源消耗的特性,能够有效缩短视频处理时间。
附图说明
17.构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:图1为本发明实施例所述的一种基于golang的高并发信号处理平台示意图。
具体实施方式
18.需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
19.下面将参考附图并结合实施例来详细说明本发明。
20.实施例一:一种基于golang的高并发信号处理平台,包括视频处理模块、弹幕渲染模块、并发协调模块;视频处理模块通过ffmpeg记录和转换数字音频和视频,并将数字音频和视频转化为流数据;视频处理模块使用goroutine对多个任务进行多线程处理;视频处理模块将一些常用的资源存储至内存中,进行复杂操作前,通过操作系统进行预先提取;弹幕渲染模块内存储有,对原始弹幕进行预先处理后得到的弹幕图片,当用户输入弹幕时,将弹幕图片投放至视频流中;并发协调模块使用mq工具将任务按照优先级分配到不同的队列中,通过golang的协程池来消费,消息队列中的任务。
21.视频处理模块使用ffmpeg处理数据的过程如下:a1、视频编码和解码:a101、打开输入文件inputfile,err:=os.open("input.mp4")iferr!=nil{panic(err)}deferinputfile.close()使用os.open()函数打开指定的输入文件,如果操作失败则会panic,否则在函数结束时及时关闭(defer关键字加入)打开的文件。
22.a102、创建一个newtranscoder对象transcoder,err:=ffmpeg.newtranscoder(inputfile,nil)iferr!=nil{panic(err)}使用ffmpeg.newtranscoder()创建一个新的转码器;传入第一个参数为输入文件,第二个参数是输出文件或输出流(如果该参数为nil则表示只对输入文件进行处理)。
23.a103、转换为h264编码options:=&ffmpeg.outputoptions{
videocodec:"h264",audiobitrate:128000,audiochannels:2,}定义了一个输出选项结构体来配置输出格式,其中包括视频编解码器、音频码率和声道数等信息。具体的选项可以根据实际需求调整。
24.a104、开始转码outputfile,err:=os.create("output.mp4")iferr!=nil{panic(err)}deferoutputfile.close()transcoder.start(outputfile,options)使用os.create()函数创建一个新的输出文件,用于写入转码后的视频数据。在defer关键字的作用下函数结束时及时关闭打开的输出文件。使用transcoder.start()启动转码操作,传入第一个参数为输出文件(可以是文件流),第二个参数为输出选项。
25.a2、剪裁视频:a201、打开输入文件inputfile,err:=os.open("input.mp4")iferr!=nil{panic(err)}deferinputfile.close()打开指定的输入文件并在处理完后及时关闭。
26.a202、创建一个新的filter对象videofilter:=ffmpeg.videofilter{filtername:"crop",filterparam:"100:100:0:0",//cropwidth=100,height=100,start_x=0,start_y=0}创建一个新的过滤器对象,即要使用的剪裁滤镜;这里定义了一个videofilter结构体对象,其中包括了它的名称以及相关的参数,例如剪裁宽度、高度、起始点坐标等信息。
27.a203、开始剪裁操作outputfile,err:=os.create("output.mp4")iferr!=nil{panic(err)}deferoutputfile.close()err=ffmpeg.process(inputfile,outputfile,&ffmpeg.options{filters:[]ffmpeg.filter{videofilter}})iferr!=nil{panic(err)}同样使用os.create()函数创建一个新的输出文件;不同之处在于使用ffmpeg.options结构体将剪裁滤镜作为选项进行设置,并使用ffmpeg.process()函数对指定的输入文件进行处理。最终将处理结果写入输出文件中。
[0028]
a3、合并视频:a301、打开输入文件inputfile1,err:=os.open("input1.mp4")
iferr!=nil{panic(err)}deferinputfile1.close()inputfile2,err:=os.open("input2.mp4")iferr!=nil{panic(err)}deferinputfile2.close()同样使用os.open()函数打开需要合并的多个输入文件。打开后要及时关闭以免内存泄漏。
[0029]
a302、创建一个新的transcoder对象transcoder,err:=ffmpeg.newtranscoder(nil,nil)iferr!=nil{panic(err)}创建一个新的转码器,不传入任何输入和输出相关信息。
[0030]
a303、处理多个输入文件options:=&ffmpeg.outputoptions{videocodec:"copy",audiocodec:"aac",outputformat:"mp4",concat:"(concat:/path/to/file1.mp4|/path/to/file2.mp4)",}定义一个输出选项结构体来配置输出格式和合并选项;这里的示例中使用了videocodec和audiocodec分别作为输入文件视频、音频数据的编解码器,使用了outputformat来指定输出文件的格式。在此之上通过设置concat属性来告诉ffmpeg需要对多个文件进行合并操作。
[0031]
a304、开始转码outputfile,err:=os.create("output.mp4")iferr!=nil{panic(err)}deferoutputfile.close()transcoder.start(outputfile,options)最后再次使用os.create()函数创建一个新的输出文件;和前面的例子一样,在函数正常结束时及时关闭打开的输出文件。使用transcoder.start()启动转码操作,传入第一个参数为输出文件(可以是文件流),第二个参数为输出选项。
[0032]
视频处理模块进行多线程处理的过程如下:读取输入视频文件列表中的所有mp4视频文件,对于视频文件列表中的每一个视频文件,都使用goroutine并发执行转码任务,等待所有goroutine执行完毕之后,结束程序。
[0033]
具体实现方式如下:b1、读取视频文件列表go语言提供了目录操作相关的函数,可以方便地获取一个文件夹中的所有文件列表。可以使用os.readdir()函数在指定的文件夹中读取所有文件列表,并逐一判断文件是否位.mp4文件类型;如果是,则保存该文件名称到一个字符串数组中。
[0034]
files,err:=os.readdir(inputfolder)
//inputfolder是输入文件夹路径iferr!=nil{panic(err)}videos:=make([]string,0)//存储视频文件的名称for_,file:=rangefiles{if!file.isdir()&&filepath.ext(file.name())==".mp4"{videos=append(videos,file.name())}}b2、启动goroutine并发执行转码任务接下来,对于音频列表中的每一个视频文件,都使用goroutine并发执行转码任务。可以定义一个transcodevideo()函数,用于进行单个视频的转码操作。然后使用go关键字启动多个goroutine并发进行转码处理。
[0035]
for_,video:=rangevideos{gotranscodevideo(video,inputfolder,outputfolder)}b3、等待goroutine执行完毕goroutine是并发执行的,因此在主线程中不能直接等待完成任务,因为当主程序结束时,所有正在运行的goroutine也会被强制关闭。因此,需要让主程序等待一段时间来确保所有的goroutine都已经完成任务。
[0036]
//等待所有goroutine执行完毕time.sleep(time.second*5)//等待五秒钟,确保所有任务都已完成fmt.println("allvideoshavebeentranscoded.")这里暂停主程序5秒钟,以确保所有任务已经完成。在实际应用中,可以根据具体情况调整等待时间,确保所有goroutine都有足够时间完成耗时较长的任务。
[0037]
b4、转换单个视频文件下面是transcodevideo()函数的代码示例:functranscodevideo(videostring,inputfolderstring,outputfolderstring){inputpath:=filepath.join(inputfolder,video)outputpath:=filepath.join(outputfolder,strings.trimsuffix(video,".mp4")+".avi")inputfile,err:=os.open(inputpath)iferr!=nil{fmt.println("failedtoopeninputfile:",inputpath)return}deferinputfile.close()transcoder,err:=ffmpeg.newtranscoder(inputfile,nil)iferr!=nil{fmt.println("failedtocreatetranscoderforfile:",inputpath)return}outputfile,err:=os.create(outputpath)iferr!=nil{fmt.println("failedtocreateoutputfile:",outputpath)return}deferoutputfile.close()options:=&ffmpeg.outputoptions{videocodec:"h264",audiocodec:"aac",outputformat:"avi",}
transcoder.start(outputfile,options)}该函数接收三个参数:视频文件名称、输入文件夹路径和输出文件夹路径;首先根据标准库的filepath.join()函数拼接出输入文件路径和输出文件路径;然后使用os.open()函数打开视频文件,并根据需要创建一个新的输出文件;接下来,使用第三方包go-ffmpeg/transcoder创建一个转码器,并指定编解码器参数进行转换;最后使用transcoder.start()方法启动转码操作。
[0038]
视频处理模块进行预处理操作的过程如下:c1、存储资源到内存中首先,需要将要提取的资源文件加载到内存中并存储;在go语言中,可以通过创建一个缓冲区来实现;对于资源的加载方式有很多方法,比如读取文件、下载文件或直接在代码中定义变量等。
[0039]
funcreadimagetomemory(imagepathstring)*bytes.buffer{//打开文件f,err:=os.open(imagepath)iferr!=nil{panic(err)}deferf.close()//将文件内容读取到缓冲区buffer:=new(bytes.buffer)_,err=io.copy(buffer,f)iferr!=nil{panic(err)}returnbuffer}这个函数接收一个图片文件路径作为参数,并返回一个bytes.buffer类型的缓冲区对象;该函数首先使用标准库的os.open()方法打开指定路径的文件;然后创建一个新的缓冲区,并使用标准库的io.copy()函数将打开的文件内容复制到缓冲区中;最后,函数返回该缓冲区对象,使其可以在内存中被访问。
[0040]
对于其他类型的资源文件(如音频、视频等),可以使用类似的方法将它们读取到内存中。
[0041]
c2、使用操作系统进行预先提取接下来,需要在应用程序启动时,使用操作系统的i/o操作从磁盘上提取资源到内存中,并保留在内存中;这样一来,当需要使用这些资源时,它们已经在内存中并且可以立即访问,而不需要再次读取磁盘上的文件。
[0042]
在go语言中,可以使用init()函数在应用程序启动时执行初始化操作。例如,要在启动应用程序时从磁盘上读取并存储所有图像资源,可以编写以下代码:varimagecache=make(map[string]*bytes.buffer)funcinit(){//获取所有图片文件列表files,err:=ioutil.readdir(image_directory)iferr!=nil{panic(err)}//对每个图像文件进行预提取for_,file:=rangefiles{
imagepath:=filepath.join(image_directory,file.name())buffer:=readimagetomemory(imagepath)imagename:=file.name()imagecache[imagename]=buffer}}这段代码中,首先使用标准库的ioutil.readdir()函数获取指定路径下的所有图片文件列表;然后循环遍历所有文件,并使用readimagetomemory()函数将每个文件读取到内存中并转换为缓冲区;最后,将内存中的图像缓冲区保存在一个全局的map中,其中,key是图片名称,value是对应图片内容的缓冲区。
[0043]
c3、使用内存中的资源当需要更改或者访问某个图像资源时,只需要从内存中获取相应的缓存,并进行操作即可:funcgetimagebuffer(imagenamestring)(*bytes.buffer,error){buffer,ok:=imagecache[imagename]if!ok{returnnil,errors.new("imagenotfound")}returnbuffer,nil}这段代码中,定义了一个函数getimagebuffer(),用于获取指定图片名称的缓冲区;该函数首先在之前预提取过的imagecachemap中查找是否存在该名称的图片文件内容,如果存在,则返回与图片名称关联的缓冲区对象;如果没有,将会返回一个错误提示。
[0044]
弹幕渲染模块进行预处理操作的过程如下:首先,确定目标视频的分辨率、帧率等参数,并设计出要投放的弹幕的样式和布局;接着,进行预处理阶段的操作,按照文字渲染、背景透明化、图片压缩的顺序逐一完成如下操作:使用python pil库对原始弹幕文本进行字体渲染,得到一张弹幕图片;将该图片的背景设置为透明,以确保其可以与视频内容无缝结合;使用现代图片压缩算法,如jpeg或png格式进行压缩,以减小文件大小。
[0045]
弹幕渲染模块进行弹幕投放的过程如下:按照计算弹幕位置、控制弹幕数量、投放弹幕图片、弹幕移动和变化的顺序逐一完成如下操作:根据视频内容以及已有弹幕的状态信息,计算新弹幕图片应该出现的位置;设定弹幕数量、速度和密度的规则,以确保弹幕的数量和质量符合预期;使用python flask框架搭建后端服务,websocket实现管理画布数据的推拉和呈现。在需要投放新弹幕时,将其对应的图片直接添加到视频流中;考虑弹幕的移动、字体大小、颜色等因素,确保其可以流畅滚动并且容易阅读。
[0046]
并发协调模块进行高并发处理的过程如下:选择rabbitmq作为消息队列工具,设计任务结构,包括任务类型、优先级、执行参数;使用golang实现并发协调模块,利用协程池控制并发数量;根据任务的优先级,在消息队列中创建不同的队列;
在服务器端,将任务按照优先级分配到对应的队列中;在客户端,根据队列中的任务启动golang协程,并从协程池中分配协程执行任务。
[0047]
实施例二:一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,其特征在于:所述处理器用于执行上述实施例一任一所述的一种基于golang的高并发信号处理平台。
[0048]
实施例三:一种服务器,其特征在于:包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行如实施例一任一所述的一种基于golang的高并发信号处理平台。
[0049]
实施例四:一种计算机可读取存储介质,存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现实施例一任一项所述的一种基于golang的高并发信号处理平台。
[0050]
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0051]
在本技术所提供的几个实施例中,应该理解到,所揭露的方法和系统,可以通过其它的方式实现。例如,以上所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。上述单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。
[0052]
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。
[0053]
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术特征:
1.一种基于golang的高并发信号处理平台,其特征在于:包括视频处理模块、弹幕渲染模块、并发协调模块;视频处理模块通过ffmpeg记录和转换数字音频和视频,并将数字音频和视频转化为流数据;视频处理模块使用goroutine对多个任务进行多线程处理;视频处理模块将一些常用的资源存储至内存中,进行复杂操作前,通过操作系统进行预先提取;弹幕渲染模块内存储有,对原始弹幕进行预先处理后得到的弹幕图片,当用户输入弹幕时,将弹幕图片投放至视频流中;并发协调模块使用mq工具将任务按照优先级分配到不同的队列中,通过golang的协程池来消费,消息队列中的任务。2.根据权利要求1所述的一种基于golang的高并发信号处理平台,其特征在于:视频处理模块使用ffmpeg处理数据的过程如下:a1、视频编码和解码:打开指定的输入文件,调用ffmpeg方法库创建一个newtranscoder对象,并将视频解码器转换为h264编码后开始转码;a2、剪裁视频:打开指定的输入文件,创建一个新的filter对象作为过滤器,创建一个新的输出文件开始剪裁操作;a3、合并视频:打开需要合并的多个输入文件,创建一个新的transcoder对象作为转码器,定义一个输出选项结构体来配置输出格式和合并选项,创建一个新的输出文件进行开始合并操作。3.根据权利要求1所述的一种基于golang的高并发信号处理平台,其特征在于:视频处理模块进行多线程处理的过程如下:读取输入视频文件列表中的所有mp4视频文件,对于视频文件列表中的每一个视频文件,都使用goroutine并发执行转码任务,等待所有goroutine执行完毕之后,结束程序。4.根据权利要求1所述的一种基于golang的高并发信号处理平台,其特征在于:视频处理模块进行预处理操作的过程如下:将要提取的资源文件加载到内存中的缓冲区并存储,在应用程序启动时,使用操作系统的i/o操作从磁盘上提取资源到内存中,并保留在内存中,当需要更改或访问某个图像资源时,从内存中获取相应的缓存,并进行操作。5.根据权利要求1所述的一种基于golang的高并发信号处理平台,其特征在于:弹幕渲染模块进行预处理操作的过程如下:根据原始弹幕的文字内容,使用一些图形库或字体渲染技术将其渲染成图片;将弹幕图片的背景设置为透明,以免遮挡住其他内容;对弹幕图片进行压缩处理;弹幕渲染模块进行弹幕投放的过程如下:根据视频内容和当前时间计算出新弹幕图片应该在视频中出现的位置;控制当前弹幕的总数量,规定弹幕速度和密度;根据计算出的弹幕位置和已有弹幕的状态信息,将弹幕图片添加到视频流中。6.根据权利要求1所述的一种基于golang的高并发信号处理平台,其特征在于:并发协调模块进行高并发处理的过程如下:
b1、选择rabbitmq作为消息队列工具,设计任务结构,包括任务类型、优先级、执行参数;b2、使用golang实现并发协调模块,利用协程池控制并发数量;b3、根据任务的优先级,在消息队列中创建不同的队列。7.根据权利要求6所述的一种基于golang的高并发信号处理平台,其特征在于:在服务器端,并发协调模块,将任务按照优先级分配到对应的队列中;在客户端,并发协调模块,根据队列中的任务启动golang协程,从协程池中分配协程执行任务。8.一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,其特征在于:所述处理器用于执行上述权利要求1-7任一所述的一种基于golang的高并发信号处理平台。9.一种服务器,其特征在于:包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行如权利要求1-7任一所述的一种基于golang的高并发信号处理平台。10.一种计算机可读取存储介质,存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1-7任一项所述的一种基于golang的高并发信号处理平台。

技术总结
本发明提供了一种基于golang的高并发信号处理平台,包括视频处理模块、弹幕渲染模块、并发协调模块;视频处理模块记录和转换数字音频和视频,并将其转化为流数据;视频处理模块对多个任务进行多线程处理;视频处理模块将一些常用的资源存储至内存中,进行复杂操作前,通过操作系统进行预先提取;当用户输入弹幕时,弹幕渲染将弹幕图片投放至视频流中;并发协调模块将任务按照优先级分配到不同的队列中,通过协程池来消费,消息队列中的任务。本发明有益效果:具有高效并发控制和协程调度的能力,内存消耗低,跨平台支持,运行速度快。运行速度快。运行速度快。


技术研发人员:朱利人
受保护的技术使用者:奥视(天津)科技有限公司
技术研发日:2023.07.11
技术公布日:2023/8/9
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐