流媒体截图系统、方法及装置
技术领域
本发明涉及流媒体数据处理技术领域,更具体地,涉及一种流媒体截图方法及装置。
背景技术
随着现代技术的发展,网络带给人们形式多样的信息,从第一张图片出现在网络上到如今各种形式的网络视频和三维动画,网络让人们的视听觉得到了很大的满足。然而在流媒体技术出现之前,人们必须要先下载这些多媒体内容到本地计算机,等待下载完成之后,才可以看到或听到媒体传达的信息。在流媒体技术出现之后,人们无需再等待多媒体内容下载完毕。其中,流媒体就是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。流媒体技术也称流式媒体技术,所谓流媒体技术就是把连续的影像和声音信息经过压缩处理后放上网站服务器,由视频服务器向用户计算机顺序或实时地传送各个压缩包,让用户一边下载一边观看、收听,而不要等整个压缩文件下载到计算机上才可以观看的网络传输技术。
由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。作为新一代互联网应用的标志,流媒体技术在近几年得到了飞速的发展。目前,市面上大部分直播网站均采用RTMP(Real Time Messaging Protocol,实时消息传输协议)相关的流媒体技术进行直播,以服务广大直播用户。对于网站产品设计需求,监管部门的监管需求以及其它需求,直播网站通常需要提供实时直播的流媒体画面。相应地,通常需要对指定流媒体进行直播截图。
相关技术中提供了一种流媒体截图方法,主要是由技术人员通过一个后台服务器实时监测流媒体串流,并对流媒体串流进行截图。
在实现本发明的过程中,发现相关技术至少存在以下问题:由于在进行流媒体截图时,是由技术人员通过单个服务器进行截图,效率较低,而流媒体串流量在逐渐增长,从而不能满足逐渐增长的截图需求。
发明内容
相关技术主要是由技术人员通过一个后台服务器实时监测流媒体串流,并手动对流媒体串流进行截图。由于在进行流媒体截图时,是由技术人员通过单台服务器进行手动截图,效率较低,而流媒体串流量在逐渐增长,从而不能满足逐渐增长的截图需求。为了解决上述问题,本发明提供一种克服上述问题或者至少部分地解决上述问题的流媒体截图系统、方法及装置。
根据本发明的第一方面,提供了一种流媒体截图系统,包括:至少一个服务器;每个服务器用于获取流媒体串流,并基于获取到的流媒体串流进行并发截图。
其中,服务器的数量由终端对应的截图需求量来实时调整,调整方式为增加服务器的数量或减少服务器的数量。
本发明提供的系统,通过基于终端对应的截图需求量来实时调整服务器的数量,并由每个服务器获取流媒体串流,并基于获取到的流媒体串流进行并发截图。由于可根据需求调整服务器的数量,且可多个服务器进行并发截图,从而可提高截图效率,以满足逐渐增长的截图需求。
根据本发明的第二方面,提供了一种流媒体截图方法,该方法包括:
步骤1,获取流媒体串流地址;
步骤2,基于获取到的流媒体串流地址的数量,开启并行进程;
步骤3,通过开启的并行进程,基于获取到的流媒体串流地址进行截图。
本发明提供的方法,通过获取流媒体串流地址,基于获取到的流媒体串流地址的数量,开启并行进程。通过开启的并行进程,基于获取到的流媒体串流地址进行截图。由于可开启多个并行进程实现并发截图处理,从而可提高截图效率,以满足逐渐增长的截图需求。
结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,步骤1进一步包括:
获取流媒体地址文本;
基于流媒体地址文本,获取流媒体串流地址。
结合第二方面的第一种可能的实现方式,在第三种可能的实现方式中,步骤1进一步包括:
从Redis队列中获取流媒体消息,基于获取到的流媒体消息,获取流媒体串流地址。
结合第二方面的第一种可能的实现方式,在第四种可能的实现方式中,步骤3进一步包括:
步骤31,对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。
结合第二方面的第四种可能的实现方式,在第五种可能的实现方式中,步骤31中通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图,包括:
当成功读取到相应的流媒体串流时,确定读取到的流媒体串流所适应的分辨率;
基于分辨率,通过任一并行进程对读取到的流媒体串流进行截图。
结合第二方面的第四种或第五种可能的实现方式,在第六种可能的实现方式中,步骤31之后还包括:
步骤32,当任一并行进程满足以下两个条件中任一条件时,退出任一并行进程,以下两个条件包括在预设时间长度内未成功读取相应的流媒体串流、成功读取相应的流媒体串流并进行了截图。
根据本发明的第三方面,提供了一种流媒体截图装置,该装置包括至少一个模块,该至少一个模块用于实现上述第二方面或第二方面的各种可能的实现方式所提供的流媒体截图方法。
根据本发明的第四方面,提供了一种流媒体截图设备,包括:
至少一个处理器;以及
与处理器通信连接的至少一个存储器,其中:
存储器存储有可被处理器执行的程序指令,处理器调用程序指令能够执行上述第二方面或第二方面的各种可能的实现方式所提供的流媒体截图方法。
根据本发明的第五方面,提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质存储计算机指令,该计算机指令使计算机执行上述第二方面或第二方面的各种可能的实现方式所提供的流媒体截图方法。
应当理解的是,以上的一般描述和后文的细节描述是示例性和解释性的,并不能限制本发明。
附图说明
图1为本发明实施例的一种流媒体截图系统的架构示意图;
图2为本发明实施例的一种流媒体截图方法的流程示意图;
图3为本发明实施例的一种流媒体截图方法的流程示意图;
图4为本发明实施例的一种流媒体截图装置的结构示意图;
图5为本发明实施例的一种流媒体截图设备的结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
流媒体指以流方式在网络中传送音频、视频和多媒体文件的媒体形式。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必等待整个文件下载完毕。由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。作为新一代互联网应用的标志,流媒体技术在近几年得到了飞速的发展。目前,市面上大部分直播网站均采用RTMP协议相关的流媒体技术进行直播,服务广大直播用户。由于网站产品设计需求,监管部门的监管需求以及其它需求,直播网站通常需要提供实时直播的流媒体画面。相应地,需要针对指定流媒体进行直播截图。
相关技术中提供了一种流媒体截图方法,主要是由技术人员通过一个后台服务器实时监测流媒体串流,并对流媒体串流进行截图。由于在进行流媒体截图时,是由技术人员通过单个服务器进行截图,效率较低,而流媒体串流量在逐渐增长,从而不能满足逐渐增长的截图需求。
针对相关技术中的问题,本发明实施例提供了一种流媒体截图系统,该系统包括:至少一个服务器;每个服务器用于获取流媒体串流,并基于获取到的流媒体串流进行并发截图。
其中,服务器的数量由终端对应的截图需求量来实时调整,调整方式为增加服务器的数量或减少服务器的数量。在调整服务器数量时,可根据服务器的截图处理性能以及截图需求量来调整,本发明实施例对此不作具体限定。
例如,根据线上环境的实际运行效果来看,对于一个24核CPU配置的服务器,截图处理能力大概为每分钟1000次。相应地,单核截图处理能力为1000次/24核=41次/每分钟。上述处理能力对应的处理过程中可能会包括50%左右无效流媒体地址。由于线上直播房间业务特点,流媒体地址设计为定时变动,故会有无法读取到流媒体的情况。当有效流媒体比率越高时,则单核处理能力会大幅提高。
按照上面的数据,若截图需求量为每分钟3000次,则可配置三个服务器。另外,可同时按照截图需求量增加或减少服务器的数量。
为了便于理解,现基于上述实施例中的系统,对本发明实施例提供方法的应用场景进行说明:为应对未来日益增加的截图需求,提高截图能力,增加截图的实时性。以截图程序为基础,通过redis读取的方式读取流媒体地址,应用多台服务器同时运行截图程序,组成截图集群是较佳解决方案。其中,以服务器为截图服务器,截图服务器为3个为例,组成的截图集群系统可参考图1。服务器可采用Linux系统,Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统,现有互联网几乎所有服务器的系统均为Linux。
理论上,横向扩展截图程序和截图服务器可以线性增加整体截图系统的吞吐量,以获取预期中更快的截图处理速度,没有上限。该方案可以充分发挥linux服务器系统简单易扩展,易部署,几乎没有性能瓶颈,可以广泛适用于各种截图场景。
本发明实施例提供的系统,通过基于终端对应的截图需求量来实时调整服务器的数量,并由每个服务器获取流媒体串流,并基于获取到的流媒体串流进行并发截图。由于可根据需求调整服务器的数量,且可多个服务器进行并发截图,从而可提高截图效率,以满足逐渐增长的截图需求。
另外,由于横向扩展截图程序和截图服务器可以线性增加整体截图系统的吞吐量,从而可获取预期中更快的截图处理速度,且没有上限。另外,还可以充分发挥linux服务器系统简单易扩展及易部署的特性,几乎没有性能瓶颈,可以广泛适用于各种截图场景。
本发明实施例提供了一种流媒体截图方法,该方法应用于上述实施例中流媒体截图系统中的服务器。参见图2,该方法包括:201、获取流媒体串流地址;202、基于获取到的流媒体串流地址的数量,开启并行进程;203、通过开启的并行进程,基于获取到的流媒体串流地址进行截图。
本发明实施例提供的方法,通过获取流媒体串流地址,基于获取到的流媒体串流地址的数量,开启并行进程。通过开启的并行进程,基于获取到的流媒体串流地址进行截图。由于可开启多个并行进程实现并发截图处理,从而可提高截图效率,以满足逐渐增长的截图需求。
作为一种可选实施例,步骤201进一步包括:
获取流媒体地址文本;
基于流媒体地址文本,获取流媒体串流地址。
作为一种可选实施例,步骤201进一步包括:
从Redis队列中获取流媒体消息,基于获取到的流媒体消息,获取流媒体串流地址。
作为一种可选实施例,步骤203进一步包括:
对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。
作为一种可选实施例,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图,包括:
当成功读取到相应的流媒体串流时,确定读取到的流媒体串流所适应的分辨率;
基于分辨率,通过任一并行进程对读取到的流媒体串流进行截图。
作为一种可选实施例,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图之后,还包括:
当任一并行进程满足以下两个条件中任一条件时,退出任一并行进程,以下两个条件包括在预设时间长度内未成功读取相应的流媒体串流、成功读取相应的流媒体串流并进行了截图。
上述所有可选技术方案,可以采用任意结合形成本发明的可选实施例,在此不再一一赘述。
基于上述实施例的内容,本发明实施例提供了一种流媒体截图方法,该方法应用于上述实施例中流媒体截图系统中的服务器。参见图3,该方法包括:301、获取流媒体串流地址;302、基于获取到的流媒体串流地址的数量,开启并行进程;303、对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。
其中,301、获取流媒体串流地址。
在获取流媒体串流地址之前,可生成需要截图的流媒体串流地址。其中,流媒体串流地址可以由流媒体域名及流媒体串地址组成,本发明实施例对此不作具体限定。
例如,若流媒体串地址为442078rJVYIvHQ9L,流媒体域名为rtmp://ahcm-rt1a.douyucdn.cn/live/,则两者可拼接成流媒体串流地址rtmp://ahcm-rt1a.douyucdn.cn/live/442078rJVYIvHQ9L。
本发明实施例不对获取流媒体串流地址的方式作具体限定,包括但不限于:获取流媒体地址文本;基于流媒体地址文本,获取流媒体串流地址。例如,以流媒体地址文本为live.txt为例,可通过读取live.txt来获取流媒体串流地址。
其中,流媒体地址文本中每行可对应一条流媒体串流地址,本发明实施例对此不作具体限定。例如,流媒体地址文本中的每条内容可如下所示,每行对应一条内容。
328173|328173rL9sEqu7kN|rtmp://ahcm-rt1a.douyucdn.cn/live/
442078|442078rJVYIvHQ9L|rtmp://ahcm-rt1a.douyucdn.cn/live/
上述每条内容中每部分以“|”分隔,以第一条内容为例。第一部分为房间号328173,第二部分为流媒体串地址328173rL9sEqu7kN,第三部分为流媒体串地址rtmp://ahcm-rt1a.douyucdn.cn/live/。通过将第二部分与第三部分进行拼接,即可得到一条流媒体串流地址。
上述通过文本获取流媒体串流地址的方式,通常适用于单个服务器的情形,即单个服务器通过在文本中按照顺序依次读取流媒体串流地址,并依次按照流媒体串流地址截图。考虑到单个服务器的截图处理能力可能不能满足截图需求量,此时可基于上述流媒体截图系统,即通过多个服务器并发的方式来实现截图。
由于通过文本难以对流媒体串流地址进行分配,而队列等数据结构便于管理,从而可通过消息队列的方式来获取流媒体串流地址。相应地,本发明实施例不对获取流媒体串流地址的方式作具体限定,包括但不限于:从Redis队列中获取流媒体消息,基于获取到的流媒体消息,获取流媒体串流地址。
需要说明的是,当只有单个服务器来实现截图时,若引入Redis队列反而会增加截图系统的复杂性,从而只需要按照上述文本方式来获取流媒体串流地址。
其中,302、基于获取到的流媒体串流地址的数量,开启并行进程。
在本步骤中,可利用python提供的并行控制程序来开启进程池,即开启并行进程。具体地,可通过如下代码来开启进程池:
pool=multiprocessing.Pool(processes=24)
在上述代码中,multiprocessing为python语言自带的并发控制程序。采用multiprocessing.Pool模型,可以实现实时的并发处理。需要说明的是,当其中一个进程完成任务时,可以再新增一个进程继续进行处理,保证实时处理有processes=24个任务同时再进行。在开启进程之后,可通过开启的并行进程来实现截图处理。
其中,303、对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。
为了便于描述,以每个并行进程处理一条流媒体串流地址为例。对于上述步骤进程池中的任一并行进程,以及获取到的流媒体串流地址中的任一流媒体串流地址,本发明实施例不对通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图的方式作具体限定,包括但不限于:当成功读取到相应的流媒体串流时,确定读取到的流媒体串流所适应的分辨率;基于分辨率,通过任一并行进程对读取到的流媒体串流进行截图。
在进行截图时,可将ffmpeg程序作为底层支持,构造相应的命令来实现流媒体串流的读取,以及基于流媒体串流来实现截图。相应地,并行进程可通过执行构造的命令来实现上述过程。具体地,构造的命令可参考如下代码:
另外,上述过程还考虑到不同终端支持的分辨率可能会不同,如直播流媒体通常会有竖屏及横屏之分,两种直播方式对应的分辨率不同。如果基于横屏对应的分辨率,来实现对竖屏进行截图,则截图区两侧会出现白边的情况。为了解决该问题,可按照上述过程先确定读取到的流媒体串流所适应的分辨率,再基于适应的分辨率,来对流媒体串流进行截图。在上述构造命令的代码中,可通过ffmpeg中的参数“-vf”来对流媒体视频对应的长宽高进行调整。具体调整可参考上述命令中的如下参数:
scale=iw*sar:ih,pad=max(iw\,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2
通过上述参数可实现对视频的长宽高进行调整,其中,iw和ih分别表示输入直播视频的宽度及高度。ow和oh分别表示输出直播可视区域的宽度及高度。另外,输出的分辨率可通过上述命令中“-s 320x180”来设置。上述命令中“–aspect 16:9”为设置视频长宽比,“-vframes1”中“-vframes”为设置将直播流媒体视频转换多少帧,后面参数1即表示转换为1帧,相当于截图。“-y”表示输出的截图图像覆盖已有文件,“/output.jpg”表示输出截图图像的默认名。
通过上述调整过程,可让避免截屏区两侧出现白边的情况。通过上述命令截完图后,截图可按照上述房间号重命名,并在云端服务器进行保存。与此同时,还可通过日志的方式记录截图操作,本发明实施例对此不作具体限定。
考虑到并行进程在读取流媒体串流时,可能会存在读取失败的情况,为了避免因流媒体地址无效或者其他读取失败的情况,导致整个截图流程卡死而无法正常退出,可为并行进程设计退出机制。相应地,本发明实施例不对退出并行进程的方式作具体限定,包括但不限于:当任一并行进程满足以下两个条件中任一条件时,退出任一并行进程,以下两个条件包括在预设时间长度内未成功读取相应的流媒体串流、成功读取相应的流媒体串流并进行了截图。
上述截图操作可通过构造的截图函数snapshot()来实现,而退出并行进程的操作可通过在截图函数snapshot()套用timeout_command函数来实现,本发明实施例对此不作具体限定。
具体地,由于multiprocessing.Pool模型无法自行确认并行进程的运行状态,需要自行提供一个超时机制,避免并行进程因为无法读取到流媒体造成的僵死状态。通过timeout_command函数,可确定当前并行进程开始运行的时间,如果超过snap_time设置的时间(预设时间长度),即强行发送中断信号给当前并行进程,以让当前并行进程退出。另外,若当前并行进程完成了截图操作,也会退出。multiprocess.Pool在判断当前并行进程退出后,并重新派生一个并行进程继续后续的截图操作,从而保证始终有一定数量的并行进程同时进行截图操作。
本发明实施例提供的方法,通过获取流媒体串流地址,基于获取到的流媒体串流地址的数量,开启并行进程。对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。由于可开启多个并行进程实现并发截图处理,从而可提高截图效率,以满足逐渐增长的截图需求。
其次,由于在截图时,可基于直播流媒体视频的不同分辨率,且可按照终端适用的屏幕类型进行截图,从而可避免截图时出现截图区两侧出现白边,进而可得到预期中的截图成品,消除不必要的干扰,为后续针对截图进行鉴黄机器学习做准备。
另外,由于并行进程在读取流媒体串流时,可能会存在读取失败或者流媒体地址无效的情况,通过在满足预设条件的情况下主动退出进程,可避免因上述情况而导致整个截图流程卡死而无法正常退出。
最后,进程在退出之后,可相应新增进程,以保证始终有一定数量的并行进程同时进行截图操作。
基于上述图2或图3对应实施例所提供的流媒体截图方法,本发明实施例提供了一种流媒体截图装置。参见图4,该装置包括:
获取模块401,用于获取流媒体串流地址;
开启模块402,用于基于获取到的流媒体串流地址的数量,开启并行进程;
截图模块403,通过开启的并行进程,基于获取到的流媒体串流地址进行截图。
作为一种可选实施例,获取模块401,用于获取流媒体地址文本;基于流媒体地址文本,获取流媒体串流地址。
作为一种可选实施例,获取模块401,用于从Redis队列中获取流媒体消息,基于获取到的流媒体消息,获取流媒体串流地址。
作为一种可选实施例,截图模块403,用于对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。
作为一种可选实施例,截图模块403,包括:
确定单元,用于当成功读取到相应的流媒体串流时,确定读取到的流媒体串流所适应的分辨率;
读取单元,用于基于分辨率,通过任一并行进程对读取到的流媒体串流进行截图。
作为一种可选实施例,该装置还包括:
退出模块,用于当任一并行进程满足以下两个条件中任一条件时,退出任一并行进程,以下两个条件包括在预设时间长度内未成功读取相应的流媒体串流、成功读取相应的流媒体串流并进行了截图。
本发明实施例提供的装置,通过获取流媒体串流地址,基于获取到的流媒体串流地址的数量,开启并行进程。对于开启的任一并行进程及获取到的任一流媒体串流地址,基于任一流媒体串流地址,通过任一并行进程读取相应的流媒体串流,并对读取到的流媒体串流进行截图。由于可开启多个并行进程实现并发截图处理,从而可提高截图效率,以满足逐渐增长的截图需求。
其次,由于在截图时,可基于直播流媒体视频的不同分辨率,且可按照终端适用的屏幕类型进行截图,从而可避免截图时出现截图区两侧出现白边,进而可得到预期中的截图成品,消除不必要的干扰,为后续针对截图进行鉴黄机器学习做准备。
另外,由于并行进程在读取流媒体串流时,可能会存在读取失败或者流媒体地址无效的情况,通过在满足预设条件的情况下主动退出进程,可避免因上述情况而导致整个截图流程卡死而无法正常退出。
最后,进程在退出之后,可相应新增进程,以保证始终有一定数量的并行进程同时进行截图操作。
本发明实施例提供了一种流媒体截图设备。参见图5,该流媒体截图设备包括:处理器(processor)501、存储器(memory)502和总线503;
其中,处理器501及存储器502分别通过总线503完成相互间的通信;
处理器501用于调用存储器502中的程序指令,以执行上述图2或图3对应实施例所提供的流媒体截图方法,例如包括:获取流媒体串流地址;基于获取到的流媒体串流地址的数量,开启并行进程;通过开启的并行进程,基于获取到的流媒体串流地址进行截图。
本发明提供一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质存储计算机指令,该计算机指令使计算机执行上述图2或图3对应实施例所提供的流媒体截图方法,例如包括:获取流媒体串流地址;基于获取到的流媒体串流地址的数量,开启并行进程;通过开启的并行进程,基于获取到的流媒体串流地址进行截图。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的信息交互设备等实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分方法。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。