掌桥专利:专业的专利平台
掌桥专利
首页

一种分布式转码方法

文献发布时间:2023-06-19 11:39:06


一种分布式转码方法

技术领域

本发明涉及视频数据处理领域,具体涉及一种分布式转码方法。

背景技术

在当今移动互联网环境下,不同格式规格视频数据正在大量的从不同设备里产生。相比过去,大量不同的视频标准、不同终端设备、不同传输网路被投入使用。视频转码是一种将原始视频的编码方式或者展示方式转换为另一种不同格式的方法,从而适应不同场景使用需求。通常来讲,转码过程是一个计算密集型的任务,根据视频帧率,分辨率的提升,计算所需时间会有较大增加。

随着科学技术发展及云计算服务的普及,计算机设备性能的提升,常规单机单进程视频转码手段难以满足使用需求,使用分布式并行计算框架以及分布式文件系统,将单一视频进行数据分片,在多计算机下同时进行转码任务,可有效减少转码消耗时间。

在进行分布式转码前一个重要工作是对视频文件进行分割,目前常用的分割手段有按照视频时长,按照码流数据长度以及按照GOP(Group of Pictures)进行分割。第一种根据时间进行分割的方式实现简单,整体分割速度较快,且图像信息保存完好,但分割后的数据长度难以保证一致,从而导致转码集群下不同机器工作不均衡。按照码流数据长度进行分割速度很快,子任务均衡,但是基于数据的分割会破坏图像GOP的连贯性,从而导致转码后视频质量下降。按照GOP为单位分割,信息不会丢失,但是需要分割组件在分割时对整个视频进行预解码,同时以GOP为单位分片会生成大量块数据块,造成多次IO操作,降低整体解码速度。

发明内容

针对现有技术中的上述不足,本发明提供的一种分布式转码方法解决了现有视频分割方法会降低解码速度、影响转码生成视频质量的问题。

为了达到上述发明目的,本发明采用的技术方案为:

提供一种分布式转码方法,其包括以下步骤:

S1、根据目标视频文件基础信息生成上传任务,将目标视频文件上传至服务器;

S2、根据上传任务对上传的文件进行校验,若通过则进入步骤S3,否则终止后续操作;

S3、增加转码任务,将目标视频文件中视频流与其他数据流进行分离,得到其他流数据和视频流数据;

S4、对视频流数据进行分片;

S5、生成转码任务队列:根据分片结果在目标视频文件中复制对应的数据段,得到若干源数据块,以及与每个源数据块对应的待转码任务和任务信息;

S6、通过主节点从转码任务队列中以FIFO方式取出待转码任务,并将任务信息交由空闲状态的转码单元进行转码;

S7、判断是否已完成所有待转码任务,若是则进入步骤S8,否则返回步骤S6;

S8、将转码后的子视频合成一个完整的视频流,并将其与分离出的其他流数据进行封装,生成一个完整的转码后的数据文件。

进一步地,步骤S1中目标视频文件基础信息包括视频类型、视频时长、视频流的编码方式、视频编码参数、视频编码等级、图像分辨率、图像采样方式、图像帧率、图像比特率、音频流的编码方式、音频流的采样率、视频文件字节长度、视频转码参数、转码后视频分辨率、转码后视频帧率和转码后视频编码方式。

进一步地,步骤S2中根据上传任务对上传的文件进行校验的具体方法为:

校验上传的文件的长度和大小;若上传的文件为封装后格式,则读取关键元数据,验证MIME文件类型是否正确;验证mdat中数据长度是否与文件大小一致;均通过,则通过验证。

进一步地,步骤S4的具体方法包括以下子步骤:

S4-1、根据视频流数据的分辨率和帧率获取其基础块大小,表示为sgt_size;

S4-2、判断视频流数据是否进行过封装,若是则进入步骤S4-3,否则进入步骤S4-9;

S4-3、对视频流数据进行解封装,读取stss关键帧列表索引信息、stsz采样块大小列表信息和stco块数据偏移列表信息;

S4-4、将stss关键帧列表索引信息与stsz采样块大小列表信息进行累加处理生成一个新的基于GOP块大小列表的且单调递增的索引列表stgs;

S4-5、在stgs中从偏移位置i

S4-6、在stss关键帧列表索引信息中查找对应位置i的采样序列号j,并根据stsz采样块大小列表信息和stco块数据偏移列表信息复制视频流数据中偏移量j

S4-7、将当前位置i作为新的偏移位置i

S4-8、重复步骤S4-5至步骤S4-7直至视频流数据的所有分片完成;

S4-9、采用0.95作为基础偏移系数获取偏移数据点,读取偏移数据点的后续数据并解码,将解码到IDR帧时的当前偏移量作为分片位置,完成一次视频流数据分片;

S4-10、重复步骤S4-9直至完成视频流数据的所有分片。

进一步地,步骤S4-1的具体方法为:

对于分辨率为360P的视频流数据,若帧率为30fps则将基础块大小设置为6M,若帧率为60fps则将基础块大小设置为12M;

对于分辨率为480P的视频流数据,若帧率为30fps则将基础块大小设置为12M,若帧率为60fps则将基础块大小设置为25M;

对于分辨率为7200P的视频流数据,若帧率为30fps则将基础块大小设置为20M,若帧率为60fps则将基础块大小设置为40M;

对于分辨率为1080P的视频流数据,若帧率为30fps则将基础块大小设置为35M,若帧率为60fps则将基础块大小设置为64M。

进一步地,步骤S6中转码单元进行转码的具体方法包括以下子步骤:

S6-1、接收到待转码任务的转码单元将节点状态由空闲更新为忙碌,解析任务信息,包括原始数据块路径、原始视频帧率、原始视频图像分辨率、原始视频编码方式、转码后的视频帧率、转码后的视频图像分辨率、转码后的视频编码方式,以及转码输出序号;

S6-2、判断待转码任务前后的视频帧率、图像分辨率和编码方式是否一致,若是则进入步骤S6-4,否则进入步骤S6-3;

S6-3、直接将视频流数据进行提取组装完成转码,进入步骤S6-5;

S6-4、根据原始视频帧率、原始视频图像分辨率、原始视频编码方式、转码后的视频帧率、转码后的视频图像分辨率和转码后的视频编码方式,采用原视频参数信息初始化解码器和待转码目标参数初始化编码器进行转码。进入步骤S6-5;

S6-5、将转码后的视频流数据写入文件系统,退出转码过程,释放解码器和编码器,关闭打开的源视频文件,清理内存以及相关资源,将转码单元的节点状态由忙碌更新为空闲。

进一步地,步骤S6-4中采用原视频参数信息初始化解码器和待转码目标参数初始化编码器进行转码的具体方法为:

采用原视频参数信息初始化解码器按照原格式对待转码视频数据流进行解压缩,还原为一帧一帧连续的YUV420格式的图像;判断一帧一帧连续的YUV420格式的图像是否出现分辨率降低,若是则将其进行伸缩至目标分辨率,得到待编码图像;否则直接得到待编码图像;

采用待转码目标参数初始化编码器对待编码图像按照转码后的视频编码方式进行编码,生成新的视频流数据,完成转码。

本发明的有益效果为:

1、本方法基于数据块分片可以快速完成数据分片,同时加入GOP检测,能够保证成像质量。相比全GOP分片会生成大量小数据任务,频繁的的任务装载会增加整体性能消耗。通过增加子任务计算量,粗放任务粒度,减少了频繁的任务带来的系统开销。

2、本方法不仅支持常规播放格式(MP4,MKV)的转码工作,还支持基于裸流(H.264,H.265)的视频转码及封装。

3、本方法基于分布式并行计算框架,将一个耗时长的转码任务分解成不同子任务并行完成整个转码过程,可大大加速整个转码过程。

附图说明

图1为本方法的流程示意图;

图2为可实现本方法的系统结构示意图。

具体实施方式

下面对本发明的具体实施方式进行描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。

如图1所示,该分布式转码方法包括以下步骤:

S1、根据目标视频文件基础信息生成上传任务,将目标视频文件上传至服务器;

S2、根据上传任务对上传的文件进行校验,若通过则进入步骤S3,否则终止后续操作;

S3、增加转码任务,将目标视频文件中视频流与其他数据流进行分离,得到其他流数据和视频流数据;

S4、对视频流数据进行分片;

S5、生成转码任务队列:根据分片结果在目标视频文件中复制对应的数据段,得到若干源数据块,以及与每个源数据块对应的待转码任务和任务信息;

S6、通过主节点从转码任务队列中以FIFO方式取出待转码任务,并将任务信息交由空闲状态的转码单元进行转码;

S7、判断是否已完成所有待转码任务,若是则进入步骤S8,否则返回步骤S6;

S8、将转码后的子视频合成一个完整的视频流,并将其与分离出的其他流数据进行封装,生成一个完整的转码后的数据文件。

步骤S1中目标视频文件基础信息包括视频类型、视频时长、视频流的编码方式、视频编码参数、视频编码等级、图像分辨率、图像采样方式、图像帧率、图像比特率、音频流的编码方式、音频流的采样率、视频文件字节长度、视频转码参数、转码后视频分辨率、转码后视频帧率和转码后视频编码方式。

步骤S2中根据上传任务对上传的文件进行校验的具体方法为:校验上传的文件的长度和大小;若上传的文件为封装后格式,则读取关键元数据,验证MIME文件类型是否正确;验证mdat中数据长度是否与文件大小一致;均通过,则通过验证。

步骤S4的具体方法包括以下子步骤:

S4-1、根据视频流数据的分辨率和帧率获取其基础块大小,表示为sgt_size;

S4-2、判断视频流数据是否进行过封装,若是则进入步骤S4-3,否则进入步骤S4-9;

S4-3、对视频流数据进行解封装,读取stss关键帧列表索引信息、stsz采样块大小列表信息和stco块数据偏移列表信息;

S4-4、将stss关键帧列表索引信息与stsz采样块大小列表信息进行累加处理生成一个新的基于GOP块大小列表的且单调递增的索引列表stgs;

S4-5、在stgs中从偏移位置i

S4-6、在stss关键帧列表索引信息中查找对应位置i的采样序列号j,并根据stsz采样块大小列表信息和stco块数据偏移列表信息复制视频流数据中偏移量j

S4-7、将当前位置i作为新的偏移位置i

S4-8、重复步骤S4-5至步骤S4-7直至视频流数据的所有分片完成;

S4-9、采用0.95作为基础偏移系数获取偏移数据点,读取偏移数据点的后续数据并解码,将解码到IDR帧时的当前偏移量作为分片位置,完成一次视频流数据分片;

S4-10、重复步骤S4-9直至完成视频流数据的所有分片。

步骤S4-1的具体方法为:

对于分辨率为360P的视频流数据,若帧率为30fps则将基础块大小设置为6M,若帧率为60fps则将基础块大小设置为12M;

对于分辨率为480P的视频流数据,若帧率为30fps则将基础块大小设置为12M,若帧率为60fps则将基础块大小设置为25M;

对于分辨率为7200P的视频流数据,若帧率为30fps则将基础块大小设置为20M,若帧率为60fps则将基础块大小设置为40M;

对于分辨率为1080P的视频流数据,若帧率为30fps则将基础块大小设置为35M,若帧率为60fps则将基础块大小设置为64M。

步骤S6中转码单元进行转码的具体方法包括以下子步骤:

S6-1、接收到待转码任务的转码单元将节点状态由空闲更新为忙碌,解析任务信息,包括原始数据块路径、原始视频帧率、原始视频图像分辨率、原始视频编码方式、转码后的视频帧率、转码后的视频图像分辨率、转码后的视频编码方式,以及转码输出序号;

S6-2、判断待转码任务前后的视频帧率、图像分辨率和编码方式是否一致,若是则进入步骤S6-4,否则进入步骤S6-3;

S6-3、直接将视频流数据进行提取组装完成转码,进入步骤S6-5;

S6-4、根据原始视频帧率、原始视频图像分辨率、原始视频编码方式、转码后的视频帧率、转码后的视频图像分辨率和转码后的视频编码方式,采用原视频参数信息初始化解码器和待转码目标参数初始化编码器进行转码。进入步骤S6-5;

S6-5、将转码后的视频流数据写入文件系统,退出转码过程,释放解码器和编码器,关闭打开的源视频文件,清理内存以及相关资源,将转码单元的节点状态由忙碌更新为空闲。

步骤S6-4中采用原视频参数信息初始化解码器和待转码目标参数初始化编码器进行转码的具体方法为:

采用原视频参数信息初始化解码器按照原格式对待转码视频数据流进行解压缩,还原为一帧一帧连续的YUV420格式的图像;判断一帧一帧连续的YUV420格式的图像是否出现分辨率降低,若是则将其进行伸缩至目标分辨率,得到待编码图像;否则直接得到待编码图像;

采用待转码目标参数初始化编码器对待编码图像按照转码后的视频编码方式进行编码,生成新的视频流数据,完成转码。

在具体实施过程中,如图2所示,可实现本方法的分布式转码系统逻辑结构由文件输入组件、数据分片组件、数据库、转码器集群几个部分组成。

文件输入组件包含一组文件上传接口,基于HTTP以及TCP网络协议,通过多点上传方式,可以最大带宽利用率完成待转码文件数据的上传工作。

分片组件实现了一个快速文件分割的方式,分片组件工作完成后会产生转码总任务记录并在数据库中进行记录,同时在任务队列中加入系列转码子任务信息。

数据库使用关系型数据库PostgreSQL以及常驻内存数据库Redis,前者用来存储转码任务详细信息,转码过程的任务记录,记录分布式系统各节点实时状态信息等。相比传统关系型数据库,内存数据库(常称为NoSQL)对于需要频繁读取修改操作速度更快,因此使用内存数据库存作为转码异步队列载体,存储一些视频转码子任务信息,视频中关键帧索引位置及数据偏移位置等。

转码集群包含一个Master节点以及多个Worker转码单元,Master节点从任务队列中以FIFO方式取出待处理任务,并将任务信息交由空闲状态的转码单元进行转码。集群执行分布式转码过程,由任务调度器收到转码单元由忙碌状态变为空闲状态时,将任务队列中头部取出一个待处理任务,将此任务分配到对应转码单元进行块转码。转码完成后输出一个转码后的数据块,记录当前块索引,视频时间戳等信息。

最后通过读取转码记录,按照顺序将转码后输出单元进行合并生成一个完整视频流数据,随后将视频流与其他流按照规定格式进行复用,生成一个完整的转码后文件,至此完成转码。

在本发明的一个实施例中,当视频为封装后格式(如MP4),解复用读取视频信息与上传任务信息进行比较,读关键取元数据信息,验证MIME文件类型,应为avc1,iso2,isom,mp41等常见格式。验证mdat中数据长度是否与文件大小一致,当mdat的数据长度加上当前偏移大于文件总长度时,则认为当前文件已损坏,不执行后续判断。当mdat验证通过后继续读取moov元数据进行验证文件时候完整)验证完成后执行后续转码操作。如果验证失败则任务当前文件已损坏,不继续执行后续转码操作。

以MP4文件为例进行解封装时,读取MOOV数据中的Video Trak元数据,读取stss(Sync Sample Box)关键帧列表索引信息,读取stsz(Sample Size Box)sample大小列表信息,读取stco(Chunk Offset Box)块数据偏移列表信息。

将读取到的stss关键帧列表信息与stsz采样块大小数据进行累加处理生成一个新的基于GOP块大小列表索引列表,在本方法中称为stgs。新生成的stgs列表长度与stss列表长度相同,每个元素值为stgs[i]=sum(stsz[0...stss[i]-1]),其中i>1。sum()代表累计求和函数,此式代表第i个stgs列表元素值等于stsz从第一个元素值到第stss[i]-1个sample的块大小的累计和。举例说明,假设stss的列表数据为(1,127,196,242,...),stgs的列表前几个累加数据则为(0,sum(stsz[0...126]),sum(stsz[0...195]),sum(stsz[0...241]),)通常情况下stsz列表的长度远大于stss列表长度,可以看出stgs列表中的数据为依次递增趋势,其中每一项的值代表着当前GOP前的数据块大小累计和。

将生成的stgs按照确定的分块大小进行分块,按照基础分块的0.9到1.1倍大小进行切分。假设当前基础分块标准大小为20MB,那么对应分割数据长度区间则为18MB-22MB,而假如stgs累加序列数据如下:(0,2M,3.52M,5.53M,...,16.62M,19.28M,22.54M,23.92M,...),则第一块分块位置则为19.28M,假设19.28MB数据对应位置为i,则在stss索引表中查找第i位置的sample number采样序列号j,至此获取到第一个分块,结合stsz块大小表与stco块偏移表提取1-j块数据写入到磁盘完成第一个数据分块。记录当前块信息:分块后序列号,块大小,所属任务信息。

在某些极端情况下分块大小不能处于预定的分块内,例如20MB的基础块大小对应为18MB~22MB,使用向后切分的策略。假如当第i个GOP累计数据大小为17.6MB,而第i+1个累计大小为22.1MB,此时分块大小使用22.1MB作为分块大小进行分割。当然,根据测试上表中每一种分块大小对应参数的视频数据中的GOP块粒度通常不会达到如此大的跨度,此处只是提供一种不满足情况的处理措施,在实际操作中出现概率极低。

当操作文件未未封装的原始视频流如H.264、H.265等,由于是原始视频流信息,不包含容器封装数据,如MP4文件下的stss、stco、stsz信息,无法直接通过封装容器读取媒体描述信息。裸视频流总的分块逻辑大致相似,仍旧先根据视频参数按照上表中数据确定基础分块大小,使用0.95作为基础偏移系数,随后读取偏移数据点后续数据并解码器,当解码到IDR帧时记录当前偏移量作为分隔点,将此段数据提取,记录当前块信息(分块后序列号、块大小、所属任务信息)进行分块。以720P、30FPS的视频为例,对应为20MB的基础分块大小,首先将数据文件读取指针偏移到20*0.95=19MB处,从此继续读取后续数据块,例如继续读取后续2M数据,在解码时发现在20.12MB(19MB+1.12MB)位置处出现下了一个I帧数据标志,将以此为分隔点,第一个分块点为20.12MB处,后续继续按照此方式进行数据分割,此分片方法使分块后的每个数据块大小近近似,而且保证了每个分块内都是完整的GOP数据,不会造成解码后图像丢失。

分割完成后,输出一个源数据块,生成一个待转码任务,任务信息包括任务生成时间,原始数据块索引,原始视频参数(包括:帧率,图像分辨率,编码方式),视频时间戳,视频时长(当待转码流为裸流时不含此项),转码后的视频参数(包括:帧率,图像分辨率,编码方式),输出序号(与原始数据块相对应)。

Worker节点收到转码任务,节点状态由空闲更新为忙碌状态,解析任务信息,包括原始数据块路径,原始视频参数(帧率,图像分辨率,编码方式),转码后的视频参数(帧率,图像分辨率,编码方式),转码输出序号。

转码完成后将转码后数据写入文件系统,退出转码过程,释放初始化的编解码器,关闭打开的源视频文件,清理内存以及相关资源。写入转码输出文件,更新转码任务信息,节点状态由忙碌更新为空闲,至此完成一个块转码任务。当检测到一个转码任务下所有子块已完全转码完成后执行音视频合并操作:首先将转码后的子视频合成一个完整的视频流,随后与之前分离出的其他流数据进行封装,生成一个完整的转码后的数据文件。

综上所述,本发明基于数据块分片可以快速完成数据分片,同时加入GOP检测,能够保证成像质量。相比全GOP分片会生成大量小数据任务,频繁的的任务装载会增加整体性能消耗。通过增加子任务计算量,粗放任务粒度,减少了频繁的任务带来的系统开销。

相关技术
  • 分布式视频转码系统及分布式视频转码方法
  • 一种分布式转码系统中监控转码任务状态的方法及装置
技术分类

06120113003776