CN112070850A - 动画数据编码、解码方法、装置、存储介质和计算机设备 - Google Patents
动画数据编码、解码方法、装置、存储介质和计算机设备 Download PDFInfo
- Publication number
- CN112070850A CN112070850A CN201910502800.6A CN201910502800A CN112070850A CN 112070850 A CN112070850 A CN 112070850A CN 201910502800 A CN201910502800 A CN 201910502800A CN 112070850 A CN112070850 A CN 112070850A
- Authority
- CN
- China
- Prior art keywords
- attribute
- animation
- data
- value
- content
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T9/00—Image coding
Landscapes
- Engineering & Computer Science (AREA)
- Multimedia (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Processing Or Creating Images (AREA)
Abstract
本申请涉及一种动画数据编码、解码方法、装置、存储介质和计算机设备,所述动画数据编码方法包括:获取动画标签码;当与动画标签码对应的属性结构表中不存在属性类型时,则根据属性结构表中各属性对应的数据类型、属性排序,依次从动画标签码对应的基础属性数据块中读取各属性对应的属性值。本申请提供的方案可以显著减少动画文件的文件大小。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种动画数据编码、动画数据解码方法、装置、计算机可读存储介质和计算机设备。
背景技术
为了让视频内容或图片内容更生动有趣,用户会在编辑视频内容或图片内容时添加动画效果,实质上动画效果是根据动画文件来呈现的,一个动画文件也可以称之为一个贴纸。动画效果越复杂,对应的动画文件所包括的动画属性数据也就越多,动画文件的文件大小也就越大。
传统方式中动画文件的制作流程是:先通过动画设计师设计出动画工程文件,动画工程文件包括动画特效数据,然后由开发工程师通过原生代码实现各类复杂动画特效。
然而,上述方式在编码的过程中需要大量额外的标识符字段来标识各个属性的属性状态,导致得到的动画文件体积太大,浪费存储空间。
发明内容
基于此,有必要针对现有技术在编码动画数据的过程中需要大量额外的标识符字段来标识各个属性,导致得到的动画文件体积太大的技术问题,提供一种动画数据编码方法、装置、计算机可读存储介质和计算机设备。
一种动画数据编码方法,包括:
从动画工程文件中获取与各动画标签码对应的动画数据;
当与所述动画标签码对应的属性结构表中存在属性类型时,则
确定各所述属性对应的属性标识信息;
按照所述属性标识信息,对所述动画数据中与各所述属性对应的属性值进行编码,得到各所述属性对应的属性内容;
根据所述属性结构表中各所述属性对应的属性排序,将各所述属性对应的属性标识信息、所述属性内容依次存储,得到所述动画标签码对应的动态属性数据块。
一种动画数据编码装置,包括:
动画数据获取模块,用于从动画工程文件中获取与各动画标签码对应的动画数据;
属性标识信息确定模块,用于当与所述动画标签码对应的属性结构表中存在属性类型时,则确定各所述属性对应的属性标识信息;
属性内容编码模块,用于按照所述属性标识信息,对所述动画数据中与各所述属性对应的属性值进行编码,得到各所述属性对应的属性内容;
数据块生成模块,用于根据所述属性结构表中各所述属性对应的属性排序,将各所述属性对应的属性标识信息、所述属性内容依次存储,得到所述动画标签码对应的动态属性数据块。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行上述动画数据编码方法的步骤。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行上述动画数据编码方法的步骤。
上述动画数据编码方法、装置、计算机可读存储介质和计算机设备中,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在获取到动画工程文件后,按照动画标签码对应的属性结构表所包括的一组属性,从动画工程文件中获取这一组属性的属性值,动态属性数据块中的属性标识信息用于描述属性的属性状态,当属性结构表中存在属性类型时,可以根据动画数据确定各个属性对应的属性标识信息,再按照属性标识信息对各属性对应的属性值进行动态编码得到对应的属性内容,结合属性结构表中各属性的属性标识信息和属性内容得到动画标签码对应的动态属性数据块,可以显著减少动画文件占用的空间。
一种动画数据解码方法,包括:
获取动画标签码;
当与所述动画标签码对应的属性结构表中存在属性类型时,则
根据所述属性结构表中各属性对应的属性类型,从所述动画标签码对应的动态属性数据块中解析各所述属性对应的属性标识信息;
根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容。
一种动画数据解码装置,所述装置包括:
获取模块,用于获取动画标签码;
属性标识信息解析模块,用于当与所述动画标签码对应的属性结构表中存在属性类型时,则根据所述属性结构表中各属性对应的属性类型,从所述动画标签码对应的动态属性数据块中解析各所述属性对应的属性标识信息;
属性内容解析模块,用于根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行上述动画数据解码方法的步骤。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行上述动画数据解码方法的步骤。
上述动画数据解码方法、装置、计算机可读存储介质和计算机设备中,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在解码时,读取到动画标签码后,当该动画标签码对应的属性结构表中存在属性类型时,说明该动画标签码所标识的一组属性的属性值是以动态属性数据块的形式编码的,可以结合各属性对应的属性类型从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息,再基于该属性标识信息可以从动态属性数据块中解析各所述属性对应的属性内容,实现动画文件的解码。
附图说明
图1为一个实施例中动画数据编码方法的应用环境图;
图2为一个实施例中在采集视频时在视频内容中添加动画贴纸的示意图;
图3为一个48比特位的数据流的示意图;
图4为一个实施例中连续无符号整数类型的数据的编码结构示意图;
图5为一个实施例中路径信息的编码结构示意图;
图6为一个实施例中PAG文件的文件组织结构示意图;
图7为一个实施例中节点元素的节点元素组织结构示意图;
图8为一个实施例中动画数据编码方法的流程示意图;
图9为一个实施例中遮罩信息对应的属性结构表和动态属性数据块的结构示意图;
图10为一个实施例中时间缓动参数数组的编码结构示意图;
图11为一个实施例中空间缓动参数数组的编码结构示意图;
图12为一个实施例中位图序列帧编码方式对应的动画数据的编码结构图;
图13为一个实施例中视频序列帧编码方式对应的动画数据的编码结构图;
图14为一个实施例中动画数据解码方法的流程示意图;
图15为一个实施例中矢量导出方式所对应的文件数据结构;
图16为一个实施例中动画数据编码装置的结构框图;
图17为一个实施例中动画数据解码装置的结构框图;
图18为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
以下对本申请涉及的部分名词进行介绍:
AE:Adobe After Effects的简称,Adobe After Effects是一种图形视频处理软件,可用于设计复杂的视频特效。设计师通过该软件设计出复杂的动画效果,得到的动画文件为AE工程文件(文件后缀名为aep),后文中也称之为动画工程文件。AE工程文件用于存储合成(Composition)以及该合成中所使用的全部源文件、动画特性参数,合成是图层(Layer)的集合。
PAG:Portable Animated Graphics的简称,是本申请提出的一种自研二进制动画文件格式。PAG文件可作为一种动画效果附着在视频中,称之为动画贴纸。
PAGExporter:一种为PAG文件自研的动画导出插件,可用于读取AE工程文件中的动画特效数据,将读取的动画特效数据以矢量导出方式、位图序列帧导出方式或视频序列帧导出方式中任意一种方式导出,得到PAG文件。PAGExpoter可作为AE软件的插件加载后实现将AE工程文件导出得到PAG文件。
PAGViewer:一种为预览PAG文件自研的动画预览软件,可用于预览PAG文件以及向PAG文件写入性能参数,以便该PAG文件上传到服务器时,可以根据性能参数对该PAG文件进行校验。
图1为一个实施例中动画数据编码方法的应用环境图。参照图1,该动画数据编码方法应用于终端110。
终端110上安装和运行有支持图形视频处理的软件,通过该软件生成动画工程文件,该软件比如可以是AE软件。终端110上还安装有动画导出插件,动画导出插件比如可以是PAGExporter。当终端110运行该软件打开动画工程文件时,终端可通过动画导出插件读取动画工程文件的动画数据,并加载动画导出插件对该动画数据进行编码,得到目标动画文件,目标动画文件比如可以是PAG文件。终端110具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。
在一个实施例中,终端110上运行的PAGExporter对动画工程文件中的动画数据进行处理,导出得到PAG文件,通过PAGViewer在播放PAG文件的过程中,统计该PAG文件的性能参数,并将计算得到的性能参数写入该PAG文件,最后还可以通过校验服务器对PAG文件所携带的性能参数进行校验,校验成功的PAG文件可发布至网络,经用户下载后播放。PAG文件可以所呈现的动画效果可以作为动画贴纸附着于视频上,如图2所示,为一个实施例中在采集视频时在视频内容中添加动画贴纸202的示意图。
下面介绍二进制动画文件格式即PAG文件用到的基础数据类型,数据类型描述了数据保存在文件中的编排格式。
在编码动画数据得到PAG文件时,所采用的基础数据类型包括整数类型、布尔类型、浮点数类型、数组类型、比特类型、时间类型、字符串类型,这些数据类型的数据长度通常是不变的,也叫做定长数据类型。
基础数据类型还包括根据这些数据类型进行排列组合自定义的新的数据结构,作为一种新的数据类型,可以称之为组合类型,这些组合类型可用于描述动画数据,包括可变长度编码整数类型、坐标类型、比率类型、颜色类型、字体类型、透明度变化信息类型、颜色变化信息类型、文本类型、路径类型、字节流类型、位图信息类型和视频帧信息类型。
下面对上述基础数据类型进行详细介绍:
一、整数类型
所有的整数数值都以二进制的形式存储在PAG文件中。从上表可以看出,整数类型的数据可以按照有符号和无符号的8位、16位、32位、64位进行存储。PAG格式中数据的存储方式可以采用“小端字节序”(little endian)进行存储,即低位字节数据存储在内存低地址处,高位字节数据存储在内存高位地址处。整数类型的数据是需要进行字节对齐的数据类型,也就说,一个整数值的第1位(bit)的值被存储在PAG文件中某个字节的第1位处。
二、布尔类型
数据类型 | 备注 |
Bool | 0代表false;1代表true |
参照上表,在PAG文件中,布尔类型的数据用一个比特位来表示。相比于用一个字节来表示而言,能够节省存储空间。布尔类型是不需要进行字节对齐的数据类型。
三、浮点数类型
数据类型 | 备注 |
Float | 单精度32位 |
在PAG文件中,小数的数据类型采用单精度浮点数类型表示。
四、数组类型
对于连续存储的相同数据类型的数据,可以在数据类型后面加[n]符号来表示这一组数据,其中n表示数组长度。例如,Uint8[10]表示Uint8类型的一维数组,长度为10。又比如,Int8[n][m]是一个二维数组,其中m表示数组长度,代表有m个数据类型为Int8[n]的数据。
五、比特类型
与占用固定位数的数据类型不一样,比特类型是一种可变长的数据类型,可用于表示有符号整数和无符号整数这两种数据。比如SB[5]可用于表示占用5位的有符号整数的数据类型,UB[2]可用于表示占用2位的无符号整数的数据类型。SB是Signed Bits的缩写,UB是Unsigned Bits的缩写。
与需要进行字节对齐的数据类型(比如Int8、Uint16)不同,比特类型的数据不需要进行字节对齐。具体地,当一个需要进行字节对齐的数据类型的数据被编码在比特类型的数据后面时,那么在比特类型的最后一个字节(Byte)需要进行字节对齐,也就是最后一个字节中除了比特类型的数据多出的位需要用零补位以进行字节对齐。
参照图3,以一个48位(6个字节)的二进制数据流来举例说明,该二进制数据流包括6个不同位长的数值,前面5个数值是比特类型的,最后1个数值是Uint16类型的,每一格代表一个字节。比特流的第一个数值(010110)占用6位,第二个数值(10100)占用5位,该数值跨越了第1个字节和第2个字节。第三个数值(100100)占用6位,第三个数值也跨越了两个字节,第四个数值(1011)占用4位,这个数值的位全部属于第3个字节。第五个数值(1101001)占用7位,在第五个数值之后的第六个数值是一个字节对齐的数值(0100110010101101),所以第五个数值所占用的字节(第4个字节)内的其余4位用零补齐。
为了能够尽量的压缩PAG文件占用的空间,针对一组相同类型的连续数据,还可以采用连续数据编码方法来进行编码。具体地,在这一组相同类型的连续数据的前面添加头部区域,头部区域中的数值用于表示这一组相同类型的连续数据所占用的位数nBits,也就是说,在该头部区域后的这一组相同类型的连续数据均按照该位数存储。具体nBits的值是多少,是根据这一组数据中的最大值来确定的,对于这一组数据中其它的较小数据,采用高位补零的方式进行编码。
如图4所示,为对连续无符号整数类型的数据进行编码的编码结构示意图,参照图4,头部区域存储这一组整数类型的连续数据中每一个数据所占用的比特位数nBits,后面紧接着采用UB[nBits]类型对这一组整数类型的连续数据进行编码,以连续的32位无符号整数的存储为例,头部区域最多占用5个比特位,用于存储nBits。
比如,一组16位无符号整数:50、100、200、300、350、400,若按照Uint16的数据类型来进行编码,则每个数值分别占用16位,这一组数值一共需要占用96位。若按照连续数据编码方法进行编码,则根据最大值400确定每个数据均占用10位,所以按照UB[10]进行编码,并且在这一组数据的前面添加一个UB[4]类型的头部区域,用于存储“10”这个值,也就是说头部区域占用4位,头部区域后紧接着的这一组连续数据占用60位,那么这一组数据仅占用64位,相比于传统方式,可以少占用32位(4个字节)。
需要说明的是,连续的有符号整数的编码与无符号整数的编码方式一致,区别是无符号整数读取出头部区域后的数据全部都表示数值内容,而有符号整型读取出的头部区域后的第1位表示符号位(0正数,1负数),接下来的连续的nBits-1位表示数值内容。对于连续的浮点数据,也可以采用上述连续数据编码方式进行编码。
进一步地,对于一些允许精度损失的连续浮点数据,还可以转换为整型数据后再按照上述连续整数类型的方式进行编码。具体地,对于表示空间上的点的坐标数据,比如空间缓动参数是浮点类型的,可以将该浮点数据除以空间精度系数(SPATIAL_PRECISION=0.05)后转换为整数;对于表示贝塞尔曲线缓动参数的坐标数据,可以将该浮点数据除以贝塞尔精度系数(BEZIER_PRECISION=0.005)后转换为整数再编码;对于表示渐变信息的坐标数据,可以将该浮点数据除以渐变精度系数(GRADIENT_PRECISION=0.00002)后转换为整数再编码。
六、时间类型
PAG文件内属于时间类型(Time)的数据统一使用Int64来描述,时间类型可以用表示帧序号,每一帧的帧序号除以帧率可以转换为以秒为单位的外部时间。
七、字符串类型
在PAG文件中,属于字符串类型(String)的数据使用null字符来标识字符串的结束。
八、可变长度编码整数类型
数据类型 | 备注 |
EncodedInt32 | 可变长度编码的32位整数 |
EncodedUint32 | 可变长度编码的32位无符号整数 |
EncodedInt64 | 可变长度编码的64位整数 |
EncodedUint64 | 可变长度编码的64位无符号整数 |
可变长度编码整数类型是以字节作为最小储存单位来表示一个整数,整数值最小占用一个字节,最多占用4个字节或8个字节。在编码可变长度编码整数类型的数值时,以字节的前7位表示该数值,第8位用于标识后面是否还有数值,第8位为0,表示下个字节不属于该数值的内容,第8位为1,表示下个字节还属于该数值的内容。因此,在解码时,如果每个字节的第8位是0,表示数值已经读完,如果第8位是1,表示数值还未读取完,需要再向下读取一个字节,直到把长度都读完为止(32位或64位)。有符号位的可变长度编码整数类型,则是先读取无符号编码整数类型的值,再来判断符号位。
比如,若数据值14的数据类型为EncodedInt32,则对应的二进制为:0011100,相比于数据类型为Int32少占用的24位。
九、坐标类型
字段 | 字段类型 | 备注 |
x | Float | X轴坐标 |
y | Float | Y轴坐标 |
坐标类型(Point)用于表示一个位置的坐标,也就是x轴,y轴的值。当编码属于坐标类型的数值时,先用32位编码的x的值,再用32位编码y的值。
十、比率类型
比率类型(Ratio)用于表示一个比率。当编码属于比率类型的数值时,先编码占用可变长度比特位的分子的值,再编码占用可变长度比特位的分母值。
十一、颜色类型
字段 | 字段类型 | 备注 |
Red | Uint8 | 红色值(0至255) |
Green | Uint8 | 绿色值(0至255) |
Blue | Uint8 | 蓝色值(0至255) |
颜色类型(Color)用于表示一种颜色值,一种颜色值通常由红色、绿色和蓝色三种颜色组成。当编码属于颜色类型的数值时,先用一个字节编码红色值,接下来的第二个字节编码绿色值,第三个字节编码蓝色值,每种颜色值的数据类型为Uint8。
十二、字体类型
字段 | 字段类型 | 备注 |
id | EncodedUint32 | 唯一标识 |
fontFamily | String | 字体家族系列 |
fontStyle | String | 字体样式 |
字体类型(FontData)用于标识字体。当编码属于字体类型的数值时,先编码可变长的字体标识,再分别采用String的数据类型编码字体所属的字体家族系列和字体样式,字体家族系列和字体样式分别占用的位数根据字符长度确定。fontFamily表示字体的名称,可以是一个字体的名称,也可以是一类字体的名称。fontStyle用于定义字体的倾斜程度,包括斜体、倾斜或正常字体。
十三、透明度变化信息类型
透明度变化信息类型(AlphaStop)用于描述透明度的渐变信息。
浮点数类型需要根据精度编码为Unit16的类型再存储,在解码时就需要将读取的Unit16的数值乘以精度得到浮点数。精度比如为0.00002f。
十四、颜色变化信息类型
字段 | 字段类型 | 备注 |
position | Uint16 | 开始点位置 |
midpoint | Uint16 | 中间点位置 |
color | Color | 颜色值 |
颜色变化信息类型(ColorStop)用于描述颜色的渐变信息。
十五、颜色梯度变化信息类型
字段 | 字段类型 | 备注 |
alphaCount | EncodedUint32 | 透明度渐变信息数组长度 |
colorCount | EncodedUint32 | 颜色渐变信息数组长度 |
alphaStopList | AlphaStop[alphaCount] | 连续alphaCount个AlphaStop |
colorStopList | ColorStop[colorCount] | 连续colorCount个ColorStop |
颜色梯度变化信息类型(GradientColor),是将透明度变化信息类型和颜色变化信息类型进行组合,得到表示颜色梯度变化信息的数据类型。一个alphaStopList(透明度变化信息列表)包括多个透明度变化信息,一个透明度变化信息包括:开始点位置、中间点位置以及透明度值。一个colorStopList(颜色变化信息列表)包括多个颜色变化信息,一个颜色变化信息包括:开始点位置、中间点位置以及颜色值。
在编码属于颜色梯度变化信息类型的数据时,先用可变长度编码整数类型EncodedUint32依次对alphaCount、colorCount进行编码,然后依次按照透明度变化信息类型所占用的位数对透明度变化信息列表中的每个透明度变化信息进行编码,再依次按照颜色变化信息类型所占用的位数对颜色变化信息列表中每个颜色变化信息进行编码。
十六、文本类型
文本类型(Text)用于描述文本信息,包括文本、字体、大小、颜色等文本信息。由于不同的图层中文本信息所包括的种类和数量都不确定,因此,在编码时用标识位来标识这些数据是否存在,并且每一个标识位都采用仅占用一位的比特类型来表示,能够节约存储空间。从上表可以看出,文本类型中一共包括19个标识位,占用3个字节,在编码时这3个字节的最后一个字节用零补齐。在编码文本类型的数据时,若某个标识位的值为0,则代表该标识位对应的文本信息不存在,则直接编码下一个值为1的标识位所对应的文本信息即可,那么在解码时,读取的下一个字节的数据也就是下一个值为1的标识位所对应的文本信息。
十七、路径类型
路径类型(Path)用于表示描述一个形状的绘制路径信息,路径信息由一组动作确定。在PAG文件中,通常包括8个动作:
在编码路径信息时,首先需要根据路径绘制信息中所有动作的数量确定numVerbs以及根据每个动作确定相应的动作值,还需要根据每个动作的坐标数据确定需要编码floatNum个float类型的值,在编码之前还需要将这floatNum个float类型的值先乘以SPATIAL_PRECISION以将浮点数转换为整数类型,再计算这floatNum个float类型的值中的最大值,根据最大值所占用的位数得到numBits,由于floatlist里面每个值占用位最多不超过31位,即numBits≤31,因此需要按照UB[5]对numBits进行编码,再将每个float类型的值按照UB[numBits]进行编码。
例如,绘制一个(x:5,y:0,r:15,b:20)的矩形,用路径类型(Path)的数据结构描述如下:执行Move动作到(5,0)点,需要记录下动作“1”以及两个Float值(5,0),再执行HLine到(15,0)点,需要记录动作“3”以及一个Float值(15),再执行VLine到(15,20)点,需要记录动作“4”以及一个Float值(20),再执行HLine到(5,20)点,需要记录动作“3”以及一个Float值(5),再执行Close闭合矩形,回到起点(5,0),需要记录动作“0”。
参照图5,为上述例子中路径信息的编码结构示意图。在编码上述路径信息时,首先对numVerbs即动作的数量“5”按照EncodedUint32进行编码,然后按照UB[3]类型依次对五个动作“1、3、4、3、0”依次编码。上述五个动作包括5个float值,分别为5、0、15、20、5,根据精度参数将这五个浮点数转换为整数类型后依次为100、0、300、400、100,其中最大值为400,400需要用10位来表示,因此numBits=10。在按照UB[5]对numBits进行编码后得到这一组连续的浮点类型数据的头部区域。最后依次按照SB[10]依次对100、0、300、400、100进行编码,从而得到整个路径信息的编码数据。
十八、字节流类型
字段 | 数据类型 | 备注 |
data | 字节地址 | 字节的起始地址 |
length | Uint64 | 字节长度 |
字节流类型(ByteData)用于表示字节流的起始地址和字节流的长度。在编码某一串字节流时,先编码这一串字节流中字节的起始地址,然后再编码整个字节流的长度,以便于在解码时从内存中的该起始地址开始按照该字节流长度读取数据,得到整个字节流。该字节地址还可以是偏移地址,在计算机为PAG文件分配相应的内存后,该字节流的起始地址可以根据分配的内存的起始地址与该偏移地址确定。
十九、位图信息类型
字段 | 字段类型 | 备注 |
x | Int32 | 差异像素区域起点位置的X坐标 |
y | Int32 | 差异像素区域起点位置的Y坐标 |
fileBytes | ByteData | 图片数据 |
位图信息类型(BitmapRect)用于表示位图图像序列中每一位图图像对应差异像素区域按照图片编码方式进行压缩编码后得到的二进制图片数据。其中x,y分别表示差异像素区域起点位置的X坐标和Y坐标。在编码位图信息时,需要找到差异像素区域中的起点位置,然后对该起点位置、差异像素区域对应的图片数据依次按照字节流类型编码,得到每一位图图像的编码数据。
二十、视频帧信息类型
字段 | 字段类型 | 备注 |
frame | Time | 帧序号 |
fileBytes | ByteData | 视频帧数据 |
视频帧信息类型(VideoFrame)用于表示位图图像序列中每一位图图像对应的合成位图按照视频编码方式进行压缩得到的二进制图片数据。其中,frame表示当前帧的帧序号,帧序号除以帧率可以转换为以秒为单位的时间。Time类型采用Int64进行编码。在编码视频帧信息时,先按照Int64对帧序号进行编码,然后再按照字节流类型对该视频帧对应的视频帧数据进行编码,得到每一视频帧的编码数据。
下面介绍PAG文件的文件组织结构。
如图6所示,PAG文件的文件组织结构由文件头(FileHeader)和节点元素(Tag)构成。文件头是PAG文件中位于开头部分用于描述文件头信息的数据结构。文件头信息至少包括文件版本号、文件长度和文件压缩方式。文件头信息可以按照下表的文件头组织结构进行组织:
字段 | 数据类型 | 字段含义 |
签名 | Unit8 | 签名字节,用于存储“P” |
签名 | Unit8 | 签名字节,用于存储“A” |
签名 | Unit8 | 签名字节,用于存储“G” |
文件版本号 | Unit32 | 文件版本号,例如0X04表示第“4”个版本 |
文件长度 | Unit32 | 整个文件的文件长度,包括文件头的长度 |
文件压缩方式 | Int8 | 文件的压缩方式 |
节点元素都具有相同的数据结构,如图7所示,节点元素都包括节点元素头部(TagHeader)和节点元素内容(TagBody),便于在解码时遇到无法解析的节点元素能够直接跳过当前的节点元素。节点结束符(End)是一个特殊的节点元素,用于标识本层次的节点元素已经全部读取,没有更多的节点元素要读取。节点元素还可以是嵌套的节点元素,在一个节点元素中可以包括一个或多个子节点元素,同样也是在结尾使用End标识子节点元素已经全部读取,没有更多的子节点元素要读取。
参照图7,节点元素头部(TagHeader)用于记录动画标签码(TagCode)和节点元素内容的字节流长度(Length)。动画标签码可用于表示节点元素具体记录了哪一类的动画信息,不同的动画标签码表示记录了不同的动画信息。字节流长度可用于表示节点元素中节点元素内容的长度。
由于TagBody记录的数据有可能非常少也可能非常多,有的只占用一个字节,则Length的值是1,有的占用了100个字节,则Length的值为100,因此,为了尽可能减少文件占用的存储空间,可以将TagHeader具体分为short类型和long类型的结构进行存储。
TagHeader short类型
TagHeader long类型
short型结构的TagHeader采用16位来记录动画标签码和节点元素内容的长度。在short型结构的TagHeader中,节点元素内容的长度的值最大可以是62(TagCodeAndLength后6位为111110时),表示TagBody最多可以存储62字节的数据。而long型结构的TagHeader中,length的数据类型为Uint32,因此节点元素内容的长度的最大值可以是4G,表示TagBody最多可以存储4G的数据。
也就说,当TagBody的长度是62字节或是小于62字节时,则TagHeader的数据类型为Uint16,前10位用于存储动画标签码,后6位用于存储Length。当TagBody的长度是63字节或是更长,则TagHeader包含了一个Uint16的TagCodeAndLength字段以及一个Uint32的Length字段,在Uint16的TagCodeAndLength中,前6位用于存储动画标签码,后6位固定为0x3f,也就是当后6位为“111111”时表示当前的TagHeader采用的是long类型结构存储,在这种情况下,TagCodeAndLength字段后紧接着采用32位的无符号整型表示TagBody的长度。在解码时,先读取TagCodeAndLength字段的前10位得到动画标签码,再读取后6位,若后6位的值不是“111111”,则读取的这6位的值即为TagBody的长度,若后6位的值是“111111”,则继续读取后面32位(4字节)的数据,读取出的这4字节的数据即为TagBody的长度。
在上述方式中,若TagBody的数据更多,需要占用更多的位,则在long型的TagHeader中,可以采用无符号64位整型记录Length的值。
进一步地,从TagCodeAndLength字段中读取出的Length的值也可以是0代表TagBody的长度是0,这种情况下,TagBody不存在。例如,前文提到的节点结束符(End)是一个特殊的节点元素,该节点元素的TagHeader中记录的Length的值为0。
当然,在上述提供的节点元素头部的数据结构中,每一个字段的数据类型可以根据实际情况进行调整,可以根据实际情况使每个字段占用更多的位数,也可以使每个字段占用更少的位数。
PAG文件提供了大量的动画标签码,用于表示丰富的动画信息。每一个动画标签码对应的动画信息的数据结构用一个属性结构表来表示。在编码PAG文件时,先按照文件头组织结构编码文件头信息,再按照节点元素的数据结构根据动画数据依次编码动画标签码(TagCode)、节点元素内容的字节流长度(Length)以及节点元素内容(TagBody)。
其中,在编码节点元素内容(TagBody)时,需要根据动画标签码所对应的属性结构表来进行编码。属性结构表定义了动画标签码所对应的动画信息的数据结构。
若动画标签码所表示的动画信息包括的属性从种类到数量都是固定的,则该动画标签码所对应的属性结构表中每个属性对应的数据类型都是基础类型,可以直接根据这些基础数据类型对该动画标签码相应的动画数据进行编码得到节点元素内容,此时编码节点元素所采用的数据结构可以称之为基础数据结构。
若TagBody记录的动画信息所包括属性的种类、数量都是不确定的,比如,遮罩的绘制路径信息,不同遮罩的绘制路径信息所包括的动作类型、动作数量可能都存在差异,此时就会需要大量额外的标识符字段,这时候用上述的方式去定义数据结构将会浪费大量的文件空间。为了能够尽量压缩文件空间,针对这种动画标签码对应的动画信息,需要重新定义其对应的属性结构表,并提供相应的编码规则来编码节点元素内容。这种新定义的属性结构表所表示的数据结构可以称之为动态属性数据结构(AttributeBlock)。
下面介绍按照上述的基础数据结构或动态属性数据结构对各动画标签码对应的动画数据进行编码得到节点元素内容(TagBody)的具体方法。
如图8所示,在一个实施例中,提供了一种动画数据编码方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图8,该动画数据编码方法具体包括如下步骤:
S802,从动画工程文件中获取与各动画标签码对应的动画数据。
其中,动画工程文件比如可以是上文提及的AE工程文件,拓展名为.aep。动画标签码用于表示该动画标签码所对应的节点元素头部后的节点元素内容具体表示的是哪一类动画信息。在编码之前,需要预先设定动画标签码与对应的动画信息之间的一一对应的关系,以便按照预先设定的一一对应关系将动画标签码与对应的动画信息对应编码。动画数据是与该动画标签码对应的描述动画信息的数据。比如,动画标签码为14,代表MaskBlock,表示动画工程文件中的某个遮罩信息,遮罩信息包括以下属性:遮罩标识、遮罩是否反转、遮罩的混合模式、遮罩的矢量路径、遮罩的透明度以及遮罩的边缘扩展参数,与该动画标签码对应的动画数据就是这些属性对应的属性值。又比如,动画标签码为13,代表Transform2D,表示动画工程文件中某个2D变换信息,2D变换信息包括以下属性:锚点坐标、位置信息、X轴偏移、Y轴偏移、缩放信息、旋转信息和透明度信息。
动画工程文件可以是设计师通过AE软件制作好的文件,动画工程文件存储了整个动画合成所使用的全部参数。动画合成(Composition)是图层的集合。终端可以在获取到该动画工程文件后,从动画工程文件中提取动画数据,并按照预先定义的动画标签码,将这些动画数据与各个动画标签码一一对应,得到各个动画标签码所对应的动画数据。例如,获取到一组2D变换信息,而预先定义的表示2D变换信息的动画标签码为“13”,则与该动画标签码“13”对应的动画数据即为这一组2D变换信息。当然,在动画工程文件中,可能存在多组不同的2D变换信息,则每一组2D变换信息都需要用动画标签码“13”来标识。
从前文描述节点元素头部的内容可以知道,PAG文件采用10比特位来存储动画标签码,最多可以存储1024种不同的动画标签码。由于动画数据是基于动画标签码与对应的数据块(包括基础数据块或动态属性数据块)进行编码的,因此,在PAG文件不断支持新的动画特性时,可以持续保证对在前的旧文件格式的向后兼容性。目前PAG文件仅用到了37种动画标签码,其中,0-29是矢量导出方式所支持的动画标签码,45-51是为位图序列帧导出方式以及视频序列帧导出方式扩展的7个动画标签码。若后续PAG文件还可以支持更多的动画特性,则还可以继续扩展新的动画标签码表示新增的动画特性所对应的动画信息。
下表介绍了各个动画标签码所分别代表的动画信息:
上述每一类动画信息所对应的属性结构表将会在后面列出。
S804,当与动画标签码对应的属性结构表中存在属性类型时,则确定各属性对应的属性标识信息。
其中,属性结构表定义了动画标签码所对应的动画信息的数据结构。在编码节点元素内容时,需要根据动画标签码所对应的属性结构表进行编码。各个动画标签码的属性结构表是预先定义好的,后文给出了各个动画标签码所对应的属性结构表。为了明确编码方式以及解码规则,当需要支持更多的动画特性时就需要扩展新的动画标签码,并且还需要定义与新增的动画标签码所对应的属性结构表。
当动画标签码所表示的动画信息包括的属性从种类到数量都不确定时,则定义的该动画标签码所对应的属性结构表中存在各属性的属性类型,该属性结构表所呈现的数据结构可以称之为动态属性数据结构。比如,对于表示遮罩信息的动画标签码“14”,其对应的属性结构表中存在属性类型。进一步地,若该属性结构表中一些属性的属性值通常情况下等于默认值,为了减小文件的大小,也可以不用存储该属性的属性值,只需要用一个比特位来表示该属性的属性值等于默认值即可。因此,该属性结构表中还包括各个属性对应的默认值。各个属性的默认值以及对应的属性类型可以硬编码在动画文件的解码代码中,以便解析时根据标识位确定为默认值时直接获取默认值。
属性类型(AttributeType)是按照动态属性数据结构编码动画数据以及解析动态属性数据块(AttributeBlock)所必需的。当某个动画标签码所对应的属性结构表中存在属性类型时,则表明该动画标签码所对应的节点元素头部后的节点元素内容需要按照动态属性数据结构进行编码。在编码阶段,属性类型用于确定属性标识信息占用的比特位数,在解码阶段,属性类型用于确定属性标识信息占用的比特位数以及相应的读取规则。
动态属性数据块主要由两部分组成:各个属性对应的属性标识信息(AttributeFlag)组成的属性标识区域以及由各个属性对应的属性内容(AttributeContent)组成的属性内容区域。以遮罩信息的属性结构表为例进行说明,参照图9,图9左边给出了遮罩信息所对应的属性结构表,其中包括6个属性,图9右边给出了该属性结构表对应的动态属性数据块的具体结构。参照图9可知,每个属性都有相应的属性标识信息(当该属性对应的属性类型为固定属性则属性标识信息不存在)和属性内容。每个属性标识信息的排列顺序是与属性内容的排列顺序一一对应的。每次给定一个属性结构表,就按照该属性结构表确定每个属性对应的属性标识信息与属性内容,然后按顺序排列存储。例如这里的AttributeFlag 0和AttributeContent 0即对应遮罩信息对应的属性结构表的第一项ID属性。从图9中可以看出,数据结构是先存储完所有的属性标识信息再开始存储所有的属性内容,这样做是因为属性标识信息区域中每项通常都是以比特位表示的,集中存储在一起可以避免频繁发生字节对齐,从而产生大量空间浪费。属性标识信息区域读取结束后会进行一次统一的字节对齐,由于字节对齐产生的额外比特位都会用0补齐,再从整字节数位置开始继续存储属性内容。
由于每个动画标签码所对应的属性结构表中定义的属性的数量是固定不会变化的,为了压缩动画文件的大小,每个动画标签码所对应的属性结构表所包括的属性的数量并不会写入动画文件,而是硬编码在解析代码中,这样解析的时候就可以直接获取该动画标签码所标识的动画信息所包括的属性的数量。
如前文所提及的,当动画标签码所表示的动画信息包括的属性从种类到数量都不确定时,则定义的该动画标签码所对应的属性结构表中存在各属性的属性类型。比如,属性的种类或数量不确定的情形包括以下几种特征:
1、有的属性对应的数据类型是一个布尔类型,需占用一个字节,但是实际上可以只用1个比特位来标识该属性的值,即0表示false,1表示true,为此,我们可以额外用属性类型来标识该属性的属性值为占用1个比特位的布尔值,在编码时只需要占用1个比特位,在解码时可以根据属性类型来解析该属性对应的属性值。
2、有的属性对应的属性值通常是默认值,为了压缩文件大小,这种情况可以不存储实际的值,在编码时可以直接使用1个比特位来标识该属性对应的属性值等于默认值即可,然后将默认值植入解析代码即可。
3、有的属性对应的属性值可能是一个动画区间特性数据,但是该动画区间特性数据不包括空间缓动参数,可以不存储空间缓动参数相关的数据。有的属性对应的属性值可能又不包括动画区间特性数据,是一个固定的值,这种情况下又只需要存储一个值即可。若该值还等于默认值,可以用1个比特位标识等于默认值即可。
根据上述动态属性数据结构中各属性的特征,每个属性都有可能存在很多不同的状态,充分利用好这些状态可以在大部分情况下显著减少文件大小。因而根据上述属性的特征,定义出的属性标识信息的数据结构如下表所示:
终端可以根据动画标签码对应的属性结构表中每个属性的属性类型和动画数据确定每个属性对应的属性标识信息。在解码时,就可以根据该属性标识信息从属性内容区域中读取该属性对应的属性内容。但每个属性对应的属性标识信息占用的比特位数是动态的,取值范围是0-3比特位。各个属性具体占用了几个比特位,需要根据属性类型确定,也就是说,属性类型可用于确定属性标识信息可能占用的比特位数(0-3位)。PAG文件将属性类型划分成以下8种,如下表所示:
从上表可以看出,普通属性的属性标识信息最多只可能占1个比特位,解码时只需要读取内容标识位。而空间缓动动画属性的属性标识信息最多会占用3个比特位来存储属性标识信息。例如,当一个空间缓动动画属性不含有动画区间特性数据且属性值等于默认值时,只需要1个比特位来表示属性标识信息,属性标识信息仅包括属性内容标志位,其值为0,表示对应的属性内容为默认值。解码时读取到内容标识位为0,代表该属性的属性标识信息已经读取完毕,不会接着读取下一比特位的值。在极限情况下,属性结构表中各个属性都不含有动画区间特性数据而且都等于默认值,那么只会占用属性数量个比特位存储各个属性对应的属性标识信息,且每个属性标识信息都只包括内容标识位,其值均为0,并且整个属性内容区域都为空,从而可以显著降低动画文件的大小。另外,固定属性的属性标识信息为空,布尔属性的属性标识信息仅占用1个比特位,简单动画属性、离散动画属性、多维时间缓动动画属性的属性标识信息占用1个或2个比特位。
从上述内容可以知道,属性标识信息可用于表示该动画标签码所对应的属性结构表中各属性的状态信息,属性类型可以用确定属性标识信息可能占用的比特位数。在编码时,可以根据各个属性对应的属性类型以及动画数据确定每个属性对应的属性标识信息。在解码时,可以根据每个属性的属性类型先确定每个属性对应的属性标识信息可能占用的比特位数,再进一步根据属性标识信息的解析规则解析得到每个属性对应的属性标识信息,从而确定如何读取每个属性对应的属性内容。
需要说明的是,每种动画标签码所对应的属性结构表中属性的数量、各个属性的数据类型、属性类型、属性的排序、属性对应的默认值都是植入在解析代码中的,也就是硬编码在解析代码中,不需要在编码时写入到动画文件中,这样可以减小动画文件的大小,或者,也可以说,动画标签码对应的属性结构表是硬编码在解析代码中的。比如,终端可以通过PAG SDK解析动画文件后进行渲染播放,每种动画标签码对应的属性结构表对应的上述信息可以硬编码在PAG SDK中。
具体地,在需要对某一个动画标签码所对应的动画数据进行编码时,终端可以先查询该动画标签码所对应的属性结构表,当该属性结构表中存在属性类型时,则先需要确定各属性对应的属性标识信息,然后再按照该属性标识信息以及根据该属性结构表所呈现的动态属性数据结构对各属性对应的动画数据进行编码,得到属性内容,将每一对属性标识信息与属性内容所构成的动态属性数据块作为动画标签码对应的节点元素内容。进一步地,该属性结构表所呈现的动态属性数据结构中的各个属性的属性标识信息可以根据对应的属性类型以及动画数据本身确定。
在一个实施例中,上述动画数据编码方法还包括:
当与动画标签码对应的属性结构表中不存在属性类型时,则根据属性结构表中各属性对应的数据类型、属性排序,依次对动画数据中与各属性对应的属性值进行编码,得到动画标签码对应的基础属性数据块。
具体地,当动画标签码所表示的动画信息包括的属性从种类到数量都是确定的时,则定义的该动画标签码所对应的属性结构表不存在各属性的属性类型,并且各属性的数据类型都是基础数据类型,该属性结构表所呈现的数据结构也称之为基础数据结构。比如,对于表示边框的尺寸和颜色信息的动画标签码“7”,其对应的属性结构表中不存在属性类型,也不存在各属性对应的默认值。在编码时,该动画标签码所对应的节点元素头部后的节点元素内容只需要根据属性结构表所呈现的基础数据结构进行编码。这里的基础数据结构是根据属性结构表中各属性对应的数据类型、属性排序确定的。
S806,按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容。
前文提到,属性标识信息用于表示动画标签码所对应的属性结构表中各属性的状态信息,因此,在确定每个属性对应的属性标识信息后,我们就能确定每个属性对应的属性内容是否存在,即是否为默认值,若是默认值,则对应的属性内容为空,若不是,则需要按照该属性对应的属性类型和数据结构对动画数据中与该属性对应的属性值进行编码,得到该属性对应的属性内容。还可以根据属性标识信息确定该属性对应的属性值是否包括动画区间特性数据、是否包括空间缓动参数信息,若是,则可以按照动画区间特性数据对应的数据结构对该属性对应的属性值进行编码,得到对应的属性内容。
在一个实施例中,属性对应的属性类型为普通属性或布尔属性,属性对应的属性标识信息仅包括内容标识位;确定各属性对应的属性标识信息,包括:若动画数据中与属性对应的属性值不是默认值时,则将内容标识位编码成表示动态属性数据块中存在与属性对应的属性内容的值;若动画数据中与属性对应的属性值是默认值时,则将内容标识位编码成表示动态属性数据块中不存在与属性对应的属性内容的值。
具体地,若属性对应的属性类型为普通属性(Value),则属性对应的属性标识信息仅包括内容标识位。内容标识位用于标识属性对应的属性内容是否存在,若存在也就是当属性对应的属性值不是默认值时,则将内容标识位编码成表示动态属性数据块中存在与属性对应的属性内容的值,该值可以是1;当属性对应的属性内容是默认值时时,则将内容标识位编码成表示动态属性数据块中不存在与属性对应的属性内容的值,该值可以是0。也就是说,若属性对应的属性类型为普通类型,则该属性对应的属性标识信息要么是1,要么是0。实际上,该内容标识位就是用来确定属性对应的属性值是否为默认值的,该标识位的值具体编码成1或0是按照设定的标识位编码规则确定的,若属性对应的属性值为默认值,则用一个标识位(比如当内容标识为0时)直接表示该属性对应的属性值为默认值即可,不需要在属性内容区域中存储实际的值,可以减小动画文件的大小,若该属性对应的属性值不是默认值,则需要在属性内容区域中与该属性对应的内容区域中将该属性对应的属性值进行编码,得到该属性对应的属性内容。
在解码阶段,解析该属性对应的属性值时,先根据属性结构表确定该属性对应的属性类型,为普通属性,说明动态属性数据块中该属性对应的属性标识信息只占用1个比特位,当从动态属性数据块中读取到的该属性对应的属性标识信息为0时,则说明该属性对应的属性值为默认值,当读取到1时,则继续从动态属性数据块中读取该属性对应的属性内容,得到该属性对应的属性值。
若属性对应的属性类型为布尔类型(BitFlag),则对应的属性值为true或false,如前文提到的,可以用一个比特位来表示该属性的值。在编码时,可以用内容标识位直接表示对应的属性值,当对应的属性值为true时,可以将属性对应的内容标识位编码成表示true的值,该值比如可以是1;当对应的属性值为false时,可以将属性对应的内容标识位编码成表示false的值,该值比如可以是0。相应地,在解码阶段解析该属性对应的属性值时,先根据属性结构表确定该属性对应的属性类型,为布尔属性,说明动态属性数据块中该属性对应的属性标识信息只占用1个比特位,并且该比特位的值即为该属性对应的属性值,也就是说,对于布尔属性而言,在解析该属性时直接将读取到的内容标识位的值作为对应的属性值,不需要解析动态属性数据块的属性内容区域。
在一个实施例中,属性对应的属性类型为固定属性,属性标识信息为空;按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容,包括:直接根据属性对应的数据类型对动画数据中与属性对应的属性值进行编码,得到属性对应的属性内容。
具体地,当属性的属性类型为固定属性(FixedValue)时,表示该属性对应的属性值是固定存在的,不需要用属性标识信息来标识这个属性的状态,在编码时,需要将该属性对应的属性值按照该属性对应的数据类型进行编码,得到该属性对应的属性内容。比如,在表示遮罩信息的属性结构表中,第一个属性表示遮罩的遮罩标识(id),该属性对应的属性类型为固定属性,表示需要将该遮罩标识按照对应的数据类型进行编码后得到对应的属性内容。
在一个实施例中,属性对应的属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性,属性标识信息至少包括内容标识位;确定各属性对应的属性标识信息,包括:若动画数据中与属性对应的属性值不是默认值时,则将内容标识位编码成表示动态属性数据块中存在与属性对应的属性内容的值;若动画数据中与属性对应的属性值是默认值时,则将内容标识位编码成表示动态属性数据块中不存在与属性对应的属性内容的值。
具体地,当属性对应的属性类型为简单动画属性(SimpleProperty)、离散动画属性(DiscreteProperty)、多维时间缓动动画属性(MultiDimensionProperty)或空间缓动动画属性(SpatialProperty)时,则该属性对应的属性标识信息至少包括内容标识位。同样地,当动画数据中与该属性对应的属性值为默认值时,则动态属性数据块中不需要存储实际的属性值,只需要将内容标识位编码成表示该属性值为默认值的值即可,该值可以是0,在解码阶段解析到该值时说明动态属性数据块中不存在与属性对应的属性内容,只需要将该属性对应的默认值作为相应的属性内容即可。
当动画数据中与该属性对应的属性值不是默认值时,则动态属性数据块中需要存储实际的属性值,则将内容标识位编码成表示动态属性数据块中存在与该属性对应的属性内容的值,该值可以是1。当内容标识位为1时,则该属性标识信息至少还包括动画区间标识位,也就是属性标识信息至少占用2个比特位。动画区间标识位用于表示该属性对应的属性值是否包括动画区间特效数据。在解码阶段,在读取到内容标识位的值表示动态属性数据块中存在属性对应的属性内容时,则读取内容标识位下一比特位的值,作为动画区间标识位的值。
在一个实施例中,属性标识信息还包括动画区间标识位;当内容标识位的值表示动态属性数据块中存在与属性对应的属性内容时,方法还包括:若属性值包括动画区间特性数据时,则将动画区间标识位编码成表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据的值;若属性值不包括动画区间特性数据时,则将动画区间标识位编码成表示动态属性数据块中存储的与属性对应的属性内容不包括动画区间特性数据的值。
其中,动画区间特性数据是动画数据的基本单位,大部分动画数据的属性都包括动画区间特性数据。若该属性对应的属性值包括动画区间特性数据,动画区间特性数据描述了多个动画区间在该属性上对应的动画数据,每个动画区间对应了一段时间轴,每个动画区间的动画特性数据描述了属性在某一个时间轴上的变化关系,实际上也是描述了与该时间轴对应的各个动画帧对应该属性的变化关系。该关系可以是线性关系、呈贝塞尔曲线关系或是静止关系(即一个时间轴内在该属性上对应的属性值保持不变)。
在一个实施例中,按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容,包括:若动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容不包括动画区间特性数据,则直接根据属性对应的数据类型,对动画数据中与属性对应的属性值进行编码,得到属性对应的属性内容。
具体地,属性对应的属性值中动画区间的数量可以是0到多个,当数量为0个时,表示该属性只包括一个有效值,说明该属性对应的属性值不包括动画区间特性数据,则需要将动画区间标识位编码成表示动态属性数据块中存储的与该属性对应的属性内容不包括动画区间特性数据的值,该值可以是0。在这种情况下,确定该属性对应的属性标识信息为“10”,在编码该属性对应属性值时,直接根据该属性对应的数据类型对属性值进行编码,得到该属性对应的属性内容。
在一个实施例中,按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容,包括:若动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据,则按照动画区间特性数据对应的数据存储结构,对属性对应的动画区间特性数据进行编码,得到与属性对应的属性内容。
具体地,属性对应的属性值中动画区间的数量为1个或多个时,则需要将动画区间标识位编码成表示动态属性数据块中存储的与该属性对应的属性内容包括动画区间特性数据的值,该值可以是1。在这种情况下,需要按照动画区间的数据结构记录下每个动画区间对应的特性数据,并且按照多个动画区间特性数据的数据存储结构(property存储结构)对各个动画区间的特性数据进行编码,得到该属性对应的属性内容。下表给出了一个动画区间所要记录的信息:
一个动画区间包含了每个区间的起始和结束时间,还包括起始时间对应的属性值、结束时间对应的属性值,还包括标识属性值计算方法的插值器类型、时间缓动参数等。对于属性类型为多维时间缓动属性的属性而言,它的动画区间还有可能包含多维度的时间缓动参数;对于属性类型为空间缓动动画属性的属性而言,动画区间还可能包含空间缓动参数。startValue、endValue表示这个动画区间的起始值和结束值,对应的startTime和endTime表示这个动画区间的起始时刻和结束时刻,所以当时刻取值等于startTime时,对应的属性值为startValue,当时刻取值等于endTime时,对应的属性值为endValue,而在startTime和endTime之间的时刻,属性的取值是由插值器类型来决定的。根据动画文件中动画特性数据的特性,定义的插值器类型如下表所示:
结合动画区间的数据结构可以看出,当插值器类型的值不等于2(Bezier)时,可以不需要存储动画区间的时间缓动参数bezierOut和bezierIn。当属性类型是离散缓动动画属性时,表示插值器类型的值一定是3(Hold),或者默认是3,就不需要存储插值器类型的值,这种情况通常出现在属性的基础数据类型是布尔类型或者枚举类型时,它的数据是离散的,要么是true要么是false,true和false之间不可能出现中间插值。当属性类型是多维时间缓动动画属性时,表示时间缓动参数是多条贝塞尔曲线组成,每条贝塞尔曲线单独控制数据值的一个分量缓动。dimensionality表示每个动画区间的时间缓动参数数组是几维的,具体是多少条贝塞尔曲线,是根据startValue和endValue的数据类型来确认,例如当数据类型是Point,时间缓动参数就是2维数组,dimensionality为2,两条贝塞尔曲线分别控制x轴、y轴的独立缓动,也就是说Point数据类型中x轴坐标的值由两条贝塞尔曲线控制,y轴坐标的值也是由两条贝塞尔曲线控制。对于大部分不是多维时间缓动动画属性的情况,不需要根据基础数据类型判断维度,默认只存储一维时间缓动参数,即dimensionality始终为1。当属性类型是空间缓动动画属性时,表示动画区间可能存在空间缓动参数,这时候具体要根据空间缓动参数标识位来判断实际当前动画区间是否存在这部分参数。
当属性对应的动画区间标识位为1时,则该属性标识信息至少还包括空间缓动参数标识位,也就是属性标识信息占用3个比特位。空间缓动参数标识位用于表示该属性对应的属性值是否包括空间缓动参数。在解码阶段,在读取到动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据时,则继续读取动画区间标识位下一比特位的值,作为空间缓动参数标识位的值。
在一个实施例中,属性对应的属性类型为空间缓动动画属性,属性标识信息还包括空间缓动参数标识位;当动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据时,方法还包括:若动画区间特性数据包括空间缓动参数,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容包括空间缓动参数的值;若动画区间特性数据不包括空间缓动参数时,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容不包括空间缓动参数的值。
其中,空间缓动参数是用于描述复杂动效的参数。只有当属性对应的属性类型为空间缓动动画属性时,该属性对应的属性标识信息才可能占用三个比特位,并且存在空间缓动参数标识位的前提是内容标识位、动画区间标识位均为1。而对于其它属性类型,都不需要判断是否存在第三个标识位,也不需要存储空间缓动参数。
在一个实施例中,按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容,包括:当空间缓动参数标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括空间缓动参数时,则按照动画区间特性数据对应的数据存储结构,对属性对应的动画区间特性数据进行编码,得到与属性对应的包括空间缓动参数的属性内容。
具体地,动画区间特性数据包括空间缓动参数,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容包括空间缓动参数的值,该值可以是1。在这种情况下,确定该属性对应的属性标识信息为“111”,在编码该属性对应的属性值时,需要按照动画区间特性数据对应的数据存储结构对该属性对应的动画区间特性数据进行编码,得到该属性对应的属性内容。
在一个实施例中,所述按照所述属性标识信息,对所述动画数据中与各所述属性对应的属性值进行编码,得到各属性对应的属性内容,包括:当空间缓动参数标识位的值表示动态属性数据块中存储的与属性对应的属性内容不包括空间缓动参数时,则按照动画区间特性数据对应的数据存储结构,对属性对应的动画区间特性数据进行编码,得到与属性对应的不包括空间缓动参数的属性内容。
具体地,动画区间特性数据不包括空间缓动参数,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容不包括空间缓动参数的值,该值可以是0。在这种情况下,确定该属性对应的属性标识信息为“110”,在编码该属性对应的属性值时,需要按照动画区间特性数据对应的数据存储结构对该属性对应的动画区间特性数据进行编码,得到的属性内容不包括空间缓动参数。
在一个实施例中,动画区间特性数据对应的数据存储结构所包括的字段包括动画区间数量、各动画区间的插值器类型、各动画区间的起始和结束时间,还包括各动画区间对应属性的起始值、结束值、时间缓动参数和空间缓动参数。
动画区间特性数据对应的数据存储结构如下表所示:
从上表给出的动画区间特性数据的数据存储结构(也称之为Property存储结构)可以看出,实际在存储多个动画区间的动画特性数据时,是依次存储每个动画区间的一类数据后再集中存储下一类数据,而不是先存储完一个动画区间的所有数据后再存储下一个动画区间的所有数据,这样做的好处是相似的数据可以集中存储并且可以集中压缩,减小存储空间。比如,插值器类型的值通常只会占用2个比特位,集中存储可以减少因字节对齐产生的额外空间浪费。又比如,下一个动画区间的startValue和startTime总等于上一个动画区间的endValue和endTime,集中存储也可以跳过不需要存储的动画区间之间重复的数据,可以进一步压缩存储空间。
需要注意的是,在解码按照动画特性数据对应的数据存储结构存储的数据时,每个字段的数据值读取结束要进行一次字节对齐,跳过没读取完的剩余比特位,从下一个整数字节位置开始,再读取下一个字段对应的数据值。
上表中提到,动画区间特性数据中动画区间的起始值和结束值(PropertyValue)可以有不同的数据类型,不同的数据类型对应了不同的存储方式。在PAG文件中,动画区间的起始值和结束值一共有15种类型,每种类型的编码方式如下表所示:
从上表可以看出,动画区间的起始值和结束值的数据类型可以是上述15种中的任意一种。在前面给出的动画区间特性数据对应的存储结构中,valueList存储的是多个动画区间的起始值和结束值,其数据类型为PropertyValueList。对于PropertyValueList,实质上是转换成一个个的PropertyValue来存储。例如:Value<Float>[]的存储结构是一个连续的Value<Float>,而Value<Float>的数据类型又是Float类型,所以Value<Float>[]实质上是一组连续的Float类型的数值。也有转换成其他类型方式存储的,例如:Value<Uint8>[]的数据类型则是转成了连续无符号整数编码方式(UB[nBits][])存储。PropertyValueList的存储方式如下表所示:
在前面给出的动画区间特性数据对应的存储结构中,timeEaseList存储的是多个动画区间的时间缓动参数,其数据类型为TimeEaseValueList。TimeEaseValueList的数据结构如下表所示:
由于每个动画区间的时间缓动参数是一对控制点,每个控制点的数据类型为Point类型,因此,多个动画区间的时间缓动参数的编码方式可以如图10所示。参照图10,TimeEaseValueList的存储方式中,先存储时间缓动参数数组中的元素占用的比特位数timeEaseNumBits,然后依次编码各个动画区间的时间缓动参数,dimensionality表示每个动画区间的bezierIn和bezierOut数组是几维的。当dimensionality的值等于1时,每个动画区间的时间缓动参数是1对bezierOut(x,y)、bezierIn(x,y),是两个Point类型的值(4个Float类型),每个Float值按照SB[timeEaseNumBits]进行编码。当dimensionality的值等于2时,则包括2对bezierOut、bezierIn的值,共8个Float类型的值。除timeEasenumBits的值外,整个TimeEaseValueList需要存储numFrames*dimensionality*4个数据值。
需要注意的是,在解码时,如果关键帧的插值器类型不是Bezier,那么直接跳过TimeEase相关数据的读取。bezierOut、bezierIn坐标成对连续存储,先编码bezierOut坐标,后编码bezierIn坐标。
在解码timeEaseList的值时,先读取5个比特位,得到timeEaseNumBits,然后再每隔timeEaseNumBits个比特位读取出的值分别为各个动画区间的bezierOut、bezierIn的坐标,读取numFrames*dimensionality*4次,得到该属性对应的时间缓动参数数组。
同样地,在前面给出的动画区间特性数据对应的存储结构中,spatialEaseList存储的是多个动画区间的空间缓动参数,其数据类型为SpatialEaseValueList。SpatialEaseValueList的数据结构如下表所示:
由于每个动画区间的空间缓动参数是一对控制点,每个控制点的数据类型为Point类型,因此,多个动画区间的空间缓动参数的编码方式可以如图11所示。参照图11,SpatialEaseValueList的存储方式中,先用连续个比特位来标识每个动画区间是否含有空间缓动参数,然后在编码空间缓动参数数组中的元素占用的比特位数spatialEaseNumBits,再依次编码各个动画区间的空间缓动参数。在解码阶段,空间缓动参数的读取需要依赖读取出的spatialFlagList列表以及spatialEaseNumBits。spatialFlagList的长度是动画区间数量的两倍,因为每个动画区间的空间缓动参数含有两个Point类型数据。spatialFlagList列表里的值依次表示每个动画区间的spatialIn和spatialOut是否存在。如果不存在,则spatialIn、spatialOut的坐标值均使用默认值(0,0)。另外,读取出来的数据为整型,需要乘以SPATIAL_PRECISION转换为Float后作为Point的x、y的值。
需要说明的是,spatialInFlag与spatialOutFlag成对连续存储,先存储spatialInFlag,后存储spatialOutFlag。floatNum的值也就是空间缓动参数数组的长度取决于spatialInFlag与spatialOutFlag标识。如果spatialInFlag为1,那么继续读取spatialInPoint的x,y坐标,spatialInFlag为0则坐标Point的x,y坐标为默认值,无需读取。SpatialIn、spatialOut按顺序存储,先存储spatialIn坐标,后存储spatialOut坐标。
在解码spatialEaseList的值时,先读取numFrames*2个比特位,得到spatialFlagList的值,然后再读取5个比特位,得到spatialEaseNumBits的值,接着按照spatialFlagList的值每隔spatialEaseNumBits个比特位读取数据,得到的就是存在空间缓动参数的动画区间的空间缓动参数。
S808,根据属性结构表中各属性对应的属性排序,将各属性对应的属性标识信息、属性内容依次存储,得到动画标签码对应的动态属性数据块。
经过前面的分析可以得出以下结论:
属性类型为普通属性,当属性对应的属性标识信息为“1”时,则直接按照该属性对应的数据类型对相应的属性值进行编码,得到属性内容;当属性对应的属性标识信息为“0”时,则相应的属性值为默认值,无需对相应的属性值进行编码,动态属性数据块中不存在相应的属性内容。
属性类型为布尔属性,当属性对应的属性标识信息为“1”时,则代表属性对应的属性值为“true”,无需对相应的属性值进行编码,动态属性数据块中不存在相应的属性内容;同理,当属性对应的属性标识信息为“0”时,则代表属性对应的属性值为“false”。
属性类型为固定属性,不存在相应的属性标识信息,直接将对应的属性值按照相应的数据类型编码后得到属性内容。
属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性,当属性对应的属性标识信息为“0”时,则相应的属性值为默认值,无需对相应的属性值进行编码,动态属性数据块中不存在相应的属性内容;当属性对应的属性标识信息为“10”时,则相应的属性值不是默认值、且不包括动画区间特性数据,需要按照该属性对应数据类型正常编码后得到属性内容;当属性对应的属性标识信息为“11”时,则相应的属性值不是默认值、且包括动画区间特性数据,需要按照动画区间特性数据的数据存储结构进行编码后得到属性内容。
属性类型为空间缓动动画属性,当属性对应的属性标识信息为“0”时,则相应的属性值为默认值,无需对相应的属性值进行编码,动态属性数据块中不存在相应的属性内容;当属性对应的属性标识信息为“10”时,则相应的属性值不是默认值、且不包括动画区间特性数据,需要按照该属性对应数据类型正常编码后得到属性内容;当属性对应的属性标识信息为“110”时,则相应的属性值不是默认值、且包括动画区间特性数据、且不包括空间缓动参数,需要按照动画区间特性数据的数据存储结构进行编码后得到不包括空间缓动参数的属性内容;当属性对应的属性标识信息为“111”时,则相应的属性值不是默认值、且包括动画区间特性数据、且包括空间缓动参数,需要按照动画区间特性数据的数据存储结构进行编码后得到包括空间缓动参数的属性内容。
动画标签码对应的属性结构表中包括多个属性,对于每个属性,都可以将动画数据中与各属性对应的属性值进行编码,也就是按照每个属性的属性标识信息、属性类型进行编码,得到相应的属性内容,最后将每个属性的属性标识信息按属性排序存储在一起得到属性标识区域、将每个属性的属性内容按属性排序存储在一起得到属性内容区域,动画标签码对应的属性标识区域、属性内容区域就构成了整个动画标签码对应的动态属性数据块。实质上,动态属性数据块就是该动画标签码(TagCode)所在的节点元素(Tag)的节点元素内容(TagBody)的值。
上述动画数据编码方法,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在获取到动画工程文件后,按照动画标签码对应的属性结构表所包括的一组属性,从动画工程文件中获取这一组属性的属性值,动态属性数据块中的属性标识信息用于描述属性的属性状态,当属性结构表中存在属性类型时,可以根据动画数据确定各个属性对应的属性标识信息,再按照属性标识信息对各属性对应的属性值进行动态编码得到对应的属性内容,结合属性结构表中各属性的属性标识信息和属性内容得到动画标签码对应的动态属性数据块,可以显著减少动画文件占用的空间。
在一个实施例中,动画标签码为位图合成标签码;从动画工程文件中获取与各动画标签码对应的动画数据,包括:播放动画工程文件;依次对动画工程文件对应的播放画面进行截图,得到动画工程文件对应的位图图像序列;按照位图序列帧导出方式对位图图像序列进行处理,得到位图合成标签码对应的图片二进制数据。
具体地,当采用位图序列帧方式对动画工程文件进行导出得到动画文件时,终端可以在播放动画工程文件的过程中,将动画工程文件对应的播放画面一帧帧截取成位图图像,得到对应的位图图像序列。在一个实施例中,可通过AE SDK的截图功能将动画工程文件的每一帧截取下来,得到每一帧对应的位图图像,从而得到整个动画工程文件对应的位图图像序列。其中,按照位图序列帧导出方式对位图图像序列进行处理,得到位图合成标签码对应的图片二进制数据包括:将位图图像序列中的位图图像与对应的关键位图图像进行像素对比,得到位图图像中的差异像素区域;当位图图像为非关键位图图像时,则按照图片编码方式对差异像素区域进行编码,得到位图图像对应的编码图片。编码图片即为每一位图图像对应的图片二进制数据。
实质上,当采用位图序列帧导出方式对动画工程文件进行导出得到动画文件时,需要获取位图合成标签码(BitmapCompositionBlock)对应的动画数据。该动画数据除了包括上述的图片二进制数据以外,还包括动画的一些基础属性数据,为此,定义的位图合成标签码的属性结构表如下表所示:
字段 | 数据类型 | 备注 |
CompositionID | EncodedUint32 | 标识 |
CompositionAttributes | CompositionAttributes Tag | 合成基础属性 |
bitmapsequences | BitmapSequence Tag[] | 位图图像序列 |
上表中,CompositionAttributes也是一个动画标签码,其对应的属性结构表如下表所示:
bitmapSequence也是一个动画标签码,其对应的属性结构表如下表所示:
从上面三个表可以看出,位图合成标签码所在的节点元素是一个嵌套的节点元素,其中嵌套了CompositionAttributes所在的节点元素以及bitmapsequence所在的节点元素。除了根据图片编码方式得到的图片二进制数据以外,位图合成标签码对应的动画数据还包括合成标识(CompositionID)、合成基础属性(CompositionAttributes)、位图图像序列(sequence),合成基础属性包括合成的播放时长、帧率和背景颜色,位图图像序列包括位图图像的宽、高、数目、关键帧标识以及图片二进制数据序列(bitmapRect[frameCount]),图片二进制序列包括每一位图图像对应的差异像素区域的宽、高、差异像素区域中起始像素点的坐标(x,y)、每一差异像素区域对应的图片二进制数据流(fileBytes)。
如图12所示,为位图序列帧编码方式对应的动画数据的编码结构图。参考图12,在编码时,先按照位图合成标签码对应的属性结构表中合成标识的数据类型编码CompositionID的值,然后按照CompositionAttributes的属性结构表依次编码基础属性数据,然后编码整个动画播放时的宽width、高height、帧率framerate,再用nBits个比特位记录接下来的每一帧是否为关键帧,再编码位图图像的总数目bitmapCount,最后依次编码位图图像序列(bitmapsequences)中每个位图图像对应的图片二进制数据,即差异像素区域中起始像素点的坐标的值(x,y)以及对应的图片二进制数据fileBytes。
在一个实施例中,动画标签码为视频合成标签码;从动画工程文件中获取与各动画标签码对应的动画数据,包括:播放动画工程文件;依次对动画工程文件对应的播放画面进行截图,得到动画工程文件对应的位图图像序列;按照视频序列帧导出方式对位图图像序列进行处理,得到视频合成标签码对应的图片二进制数据。
其中,按照视频序列帧导出方式对位图图像序列进行处理,得到视频合成标签码对应的图片二进制数据包括:将位图图像划分成颜色通道位图和透明度通道位图;合成颜色通道位图和透明度通道位图,得到合成位图;按照视频编码方式对合成位图进行编码,得到位图图像对应的编码图片。编码图片即为每一位图图像对应的图片二进制数据。
当采用视频序列帧导出方式对动画工程文件进行导出得到动画文件时,需要获取视频合成标签码(VideoCompositionBlock)对应的动画数据。
字段 | 字段类型 | 备注 |
CompositionID | EncodedUint32 | 唯一标识 |
hasAlpha | Bool | 是否有Alpha通道 |
CompositionAttributes | CompositionAttributes Tag | |
videosequences | VideoSequenceTag[] |
VideoSequence也是一个动画标签码,对应的属性结构表如下表所示:
从上面给出的视频合成标签码的属性结构表可以看出,视频合成标签码所在的节点元素是一个嵌套的节点元素,嵌套了CompositionAttributes所在的节点元素和videoSequence所在的节点元素。除了根据视频编码方式得到的图片二进制数据以外,视频合成标签码对应的动画数据还包括合成标识(CompositionID)、是否包括透明通道(hasAlpha)、合成基础属性(CompositionAttributes)、视频帧序列(videoSequence),合成基础属性包括合成的播放时长、帧率和背景颜色,视频帧序列包括位图图像的宽、高、透明通道位置信息、视频编码方式的参数、关键帧标识以及图片二进制数据序列(videoFrames),图片二进制序列包括每一视频帧对应的时间戳和图片二进制数据流(fileBytes)。
如图13所示,为视频序列帧编码方式对应的动画数据的编码结构图。参照图13,在编码时,先按照视频合成标签码对应的属性结构表中合成标识的数据类型编码CompositionID的值、按照布尔类型编码标识是否存在透明通道hasAlpha的值,然后按照CompositionAttributes的属性结构表依次编码基础属性数据,然后编码整个动画播放时的宽width、高height、帧率framerate,紧接着是透明通道起始位置信息alphaStartX和alphaStartY,然后再编码视频编码参数sps和pps,再编码位图图像的总数目Count,最后依次编码视频帧序列(videoSequence)中每个合成位图对应的帧序号frame和图片二进制数据fileBytes。
在一个实施例中,上述动画数据编码方法还包括:按照文件头组织结构,将文件头信息依次编码,得到文件头编码信息;按照节点元素组织结构,将动画标签码、数据块长度和数据块依次编码,得到节点元素编码数据;数据块包括动态属性数据块和基础属性数据块;将文件头编码信息、各节点元素编码数据按照目标文件结构进行组织,得到目标动画文件。
这里的目标动画文件是PAG文件,PAG文件的文件组织结构包括文件头(FileHeader)和节点元素(Tag)。因此在编码整个动画文件的数据时,是按照文件头的组织结构将文件头信息进行编码,得到文件头编码信息。节点元素组织结构包括动画标签码、数据块长度以及数据块,因此,对于从动画工程文件中获取的与各动画标签码对应的动画数据,是按照节点元素组织结构依次编码后得到节点元素编码数据。这里的数据块包括动态属性数据块和基础属性数据块。在得到文件头编码信息以及节点元素编码数据后,按照目标动画文件的文件结构进行组织,得到目标动画文件。
仅在按照矢量导出方式对动画工程文件进行导出时才会得到动态属性数据块。对于基础属性数据块,在按照矢量导出方式、位图序列帧导出方式以及视频序列帧导出方式进行导出时,都可能会用到。针对不同的动画标签码,对应的属性结构表不同,属性结构表中不同属性的属性类型不同,可能会按照基础属性数据块进行编码,也可能会按照动态属性数据块进行编码。
下面对前文列出的37个动画标签码的属性结构表进行介绍。
End
字段 | 数据类型 | 备注 |
End | Unit16 | Tag结束标识 |
End作为一个特殊的动画标签码,标识着某个节点元素的结束,当解码过程中读取到这个标签时,标记与这个End对应的节点元素的内容都已经读取完了。如果节点元素包含嵌套,也就是包括子节点元素,那么在需要跳出当前节点元素的内容继续读取,从外层的字节元素读取内容。
FontTables
字段 | 数据类型 | 备注 |
count | EncodedUint32 | 字体数目 |
fontData | FontData[] | 字体数组 |
FontTables是字体信息的合集。
VectorCompositionBlock
VectorCompositionBlock是按照矢量导出方式的动画数据的集合,里面可以包含简单的矢量图形数据,也可以再包含一个或多个VectorComposition。
字段 | 数据类型 | 备注 |
width | EncodedInt32 | 图层的宽 |
height | EncodedInt32 | 图层的高 |
duration | EncodedUint64 | 持续时间 |
frameRate | Float | 帧率 |
backgroundColor | Color | 背景颜色 |
CompositionAttributes是合成的基本属性信息。
ImageTables
字段 | 数据类型 | 备注 |
count | EncodedInt32 | 图片数目 |
images | ImageBytesTag[] | 图片数组 |
ImageTables是图片信息的合集。
LayerBlock
LayerBlock是图层信息的合集。
LayerAttributes
LayerAttributes表示与图层属性相关的信息。
SolidColor
字段 | 数据类型 | 备注 |
solidColor | Color | 颜色值 |
width | EncodedInt32 | 宽 |
height | EncodedInt32 | 高 |
LayerAttributes是图层的属性信息。
TextSource
TextSource表示文本信息,包含:文本,字体,大小,颜色等基础信息。
TextPathOption标签
字段 | 字段类型 | 属性类型 | 默认值 | 备注 |
path | Mask Tag | Value | null | 路径信息 |
reversedPath | Bool | DiscreteProperty | false | 是否反转路径 |
perpendicularToPath | Bool | DiscreteProperty | false | 垂直路径 |
forceAlignment | Bool | DiscreteProperty | false | 强制对齐 |
firstMargin | Float | SimpleProperty | 0.0f | 开始留白 |
lastMargin | Float | SimpleProperty | 0.0f | 最后留白 |
TextPathOption表示文本绘制信息,包含绘制路径、前后左右间距等。
TextMoreOption标签
TextMoreOption表示文本其他信息。
ImageReference标签
字段 | 数据类型 | 备注 |
id | EncodedUint32 | 图片标识 |
ImageReference表示图片索引,存储的是图片的ID,通过ID索引真正的图片信息。
CompositionReference标签
字段 | 数据类型 | 备注 |
id | EncodedUint32 | 标识 |
compositionStartTime | Int64 | 开始时间 |
CompositionReference表示图层组合索引,存储的是图层组合的ID,通过ID索引真正的图层组合。
Transform2D标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
anchorPoint | Point | Value | (0.0) | 锚点 |
position | Point | Value | (0.0) | 位置信息 |
xPosition | Float | Value | 0.0 | x轴偏移 |
yPosition | Float | Value | 0.0 | y轴偏移 |
scale | Point | Value | (0.0) | 缩放 |
rotation | Float | Value | 0.0 | 旋转 |
opacity | unit8 | Value | 255 | 透明度(0~255) |
Transform2D表示2D变换信息,包含:锚点,缩放,旋转,x轴偏移,y轴偏移等信息。
Mask标签
Mask表示遮罩信息。
ShapeGroup标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
blendMode | 枚举(Unit8) | Value | BlendMode::Normal | 图像混合模式 |
transform | ShapeTransform | Value | 无 | 变换 |
elements | Shape[] | Value | 无 | 元素 |
ShapeGroup表示投影信息。
Rectangle标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
reversed | Bool | BitFlag | false | 是否翻转矩形的标识 |
size | Point | MultiDimensionProperty | (100,100) | 矩形宽高 |
position | Point | SpatialProperty | (0,0) | 矩形位置 |
roundness | Float | SimpleProperty | 0.0f | 圆角 |
Rectangle表示矩形信息。
Ellipse标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
reversed | Bool | BitFlag | false | 是否翻转椭圆的标识 |
size | Point | MultiDimensionProperty | (100,100) | 宽高 |
position | Point | SpatialProperty | (0,0) | 位置 |
Ellipse表示椭圆信息。
PolyStar标签
PolyStar表示多边星形的信息。
ShapePath标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
shapePath | Path | SimpleProperty | 无 | 路径形状 |
ShapePath表示形状的路径信息。
Fill标签
Fill表示与填充相关的信息。
Stroke标签
Stroke表示与描边相关的信息。
GradientFill标签
GradientFill表示颜色渐变填充信息。
GradientStroke标签
GradientStroke表示描边的透明度渐变信息。
MergePaths标签
MergePaths表示合并路径相关的信息。
TrimPaths标签
TrimPaths表示路径生成效果相关的信息。
Repeater标签
Repeater表示中转器相关的信息。
RoundCorners标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
radius | Float | SimpleProperty | 10.0f | 半径 |
RoundCorners表示圆角相关的信息。
Performance标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
renderingTime | Int64 | Value | 0 | 渲染耗时 |
imageDecodingTime | Int64 | Value | 0 | 图片解码耗时 |
presentingTime | Int64 | Value | 0 | 上屏耗时 |
graphicsMemory | Int64 | Value | 0 | 渲染内存 |
Performance表示动画的性能参数。
DropShadowStyle标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
blendMode | 枚举(Unit8) | DiscreteProperty | BlendMode::Normal | 图像混合模式 |
color | Color | SimpleProperty | Black | 颜色 |
opacity | unit8 | SimpleProperty | 191 | 透明度(0~255) |
angle | Float | SimpleProperty | 120.0f | 角度 |
distance | Float | SimpleProperty | 5.0f | 距离 |
size | Float | DiscreteProperty | 5.0f | 尺寸大小 |
DropShadowStyle表示添加阴影相关的信息。
StrokeStyle标签
StrokeStyle是与描边样式相关的信息。
TintEffect标签
TintEffect是与着色效果相关的信息。
FillEffect标签
字段 | 数据类型 | 属性类型 | 默认值 | 备注 |
allMasks | Bool | BitFlag | false | 所有遮罩 |
fillMask | Mask Tag | Value | null | 要填充的遮罩 |
color | Color | SimpleProperty | Red | 颜色 |
invert | Bool | DiscreteProperty | false | 是否翻转遮罩 |
horizontalFeather | Float | SimpleProperty | 0.0f | 水平边缘羽化 |
verticalFeather | Float | SimpleProperty | 0.0f | 垂直边缘羽化 |
opacity | unit8 | SimpleProperty | 255 | 透明度(0~255) |
FillEffect是与填充效果相关的信息。
StrokeEffect标签
StrokeEffect是与描边效果相关的信息。
TritoneEffect标签
TritoneEffect表示高光、中间色、阴影效果。
DropShadowEffect标签
DropShadowEffect表示填充阴影效果信息。
FillRadialWipeEffect标签
FillRadialWipeEffect表示填充径向擦除效果信息。
DisplacementMapEffect标签
DisplacementMapEffect表示置换图层信息。
BitmapCompositionBlock
BitmapCompositionBlock表示按照位图序列帧方式导出得到的合成。
CompositionAttributes
字段 | 数据类型 | 备注 |
duration | EncodedUint64 | 播放时长 |
frameRate | Float | 帧率 |
backgroundColor | Color | 背景颜色 |
CompositionAttributes表示按照位图序列帧方式导出的合成的基础属性信息。
BitmapSequence
BitmapSequence表示位图图像序列。
ImageBytes
字段 | 字段类型 | 备注 |
id | EncodedUint32 | 标识 |
width | EncodedInt32 | 图片宽 |
width | EncodedInt32 | 图片宽 |
anchorX | EncodedInt32 | x轴坐标 |
anchorY | EncodedInt32 | y轴坐标 |
fileBytes | ByteData | 图片字节流 |
ImageBytes表示编码后的图片属性信息。
ImageBytes2
字段 | 字段类型 | 备注 |
id | EncodedUint32 | 标识 |
width | EncodedInt32 | 图片宽 |
width | EncodedInt32 | 图片宽 |
anchorX | EncodedInt32 | x轴坐标 |
anchorY | EncodedInt32 | y轴坐标 |
fileBytes | ByteData | 图片字节流 |
scaleFactor | Float | 缩放比例(0~1.0) |
ImageBytes2存储图片相关属性信息,相对于ImageBytes多了一个scaleFactor属性。
ImageBytes3相对于ImageBytes2只是将透明边框剥离了,属性值没变。
VideoCompositionBlock
字段 | 字段类型 | 备注 |
CompositionID | EncodedUint32 | 唯一标识 |
hasAlpha | Bool | 是否有Alpha通道 |
CompositionAttributes | CompositionAttributes Tag | 合成基础属性 |
videosequences | VideoSequenceTag[] | 视频帧序列 |
VideoCompositionBlock表示按照视频序列帧导出方式进行导出得到的合成。
VideoSequence
VideoSequence表示序列帧序列。
如图14所示,在一个实施例中,提供了一种动画数据解码方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图14,该动画数据解码方法具体包括如下步骤:
S1402,获取动画标签码。
在解析PAG文件时,除了文件头信息需要按照文件头组织结构进行解码以外,剩下的若干个节点元素需要按照节点元素组织结构进行解码。节点结束符(End)是一个特殊的节点元素,用于标识本层次的节点元素已经全部读取,没有更多的节点元素要读取,所以当读取到节点结束符(0)后表示当前节点元素的内容已经读取完毕,继续读取得到的数据是下一个节点元素的内容。当然,若节点元素是嵌套的节点元素,包括多个子节点元素,则在节点结束符后继续读取得到的数据是外层节点元素的内容,直至得到最外层节点元素对应的节点结束符或者按照最外层节点元素内容的字节流长度读取完毕后,表示最外层节点元素也没有更多的内容要读取。
根据前文描述的节点元素组织结构,节点元素都包括节点元素头部(TagHeader)和节点元素内容(TagBody),节点元素头部包括动画标签码(TagCode)和节点元素内容的字节流长度(Length)。节点元素头部分为short类型和long类型,不管是short类型或是long类型,节点元素头部的前2个字节中的前10bits表示的是动画标签码,因此,当读取到END对应的动画标签码(0)之后,继续读取2个字节,这2个字节的前10bits表示的是下一个节点元素包括的动画标签码。若前2个字节的后6bits不是“0x3f”,则说明该节点元素的节点元素头部是short类型的,根据short类型的节点元素头部的组织结构,后6bits的值表示的是节点元素内容(TagBody)的字节流长度(Length)。若前2个字节的后6bits是“0x3f”,则说明该节点元素的节点元素头部是long类型的,根据long类型的节点元素头部的组织结构,继续读取这2个字节后的4个字节,得到的数据值表示的是节点元素内容(TagBody)的字节流长度(Length)。字节流长度的值表示的是节点元素内容占用的字节数,在解析得到字节流长度后,就可以确定在节点元素头部之后的多少个字节的数据是属于当前节点元素的节点元素内容。
动画标签码用于表示节点元素具体记录了哪一类的动画信息,不同的动画标签码表示记录了不同的动画信息。当解析到某个动画标签码后,就可以确定当前节点元素的节点元素内容表示的是什么动画信息,不同的动画信息的节点元素内容有着不同的编码结构,因此,获取每个节点元素中的动画标签码是准确解析各个节点元素,尤其是节点元素内容的前提。
如前文提到的,PAG文件采用10比特位来存储动画标签码,最多可以存储1024种不同的动画标签码。目前PAG文件仅用到了37种动画标签码,其中,0-29是矢量导出方式所支持的动画标签码,45-51是为位图序列帧导出方式以及视频序列帧导出方式扩展的7个动画标签码。若后续PAG文件还可以支持更多的动画特性,则还可以继续扩展新的动画标签码表示新增的动画特性所对应的动画信息。
进一步地,当解析到一个动画标签码后,需要根据动画标签码所表示动画信息对应的属性结构表来解析当前节点元素的节点元素内容。主要分为两种情况,当解析得到的动画标签码所对应的属性结构表中不存在属性类型时,则节点元素内容中的数据是以基础属性数据块的形式存储的,当解析得到的动画标签码所对应的属性结构表中存在属性类型时,则节点元素内容中的数据是以动态属性数据块的形式存储的。
S1404,当与动画标签码对应的属性结构表中存在属性类型时,则根据属性结构表中各属性对应的属性类型,从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息。
其中,属性结构表定义了动画标签码所对应的动画信息的数据结构。当某个动画标签码所对应的属性结构表中存在属性类型时,则表明该动画标签码所对应的节点元素头部后的节点元素内容需要按照动态属性数据结构进行解码。动态属性数据块主要由两部分组成:各个属性对应的属性标识信息(AttributeFlag)组成的属性标识区域以及由各个属性对应的属性内容(AttributeContent)组成的属性内容区域。属性类型(AttributeType)用于确定属性标识信息占用的比特位数以及相应的属性内容的读取规则。属性类型包括普通属性、布尔属性、固定属性、简单动画属性、离散动画属性、多维时间缓动动画属性和空间缓动动画属性。
以遮罩信息为例,当读取到表示遮罩信息的动画标签码“14”时,由于遮罩信息对应的属性结构表中存在属性类型,因此对于当前节点元素的节点元素内容,需要按照动态属性数据结构进行解析。总体上,是先解析出动态属性数据块中的属性标识区域,然后进行一次统一的字节对齐后再从整数字节数位置开始读取属性内容区域,依次得到遮罩信息所对应的属性结构表中各属性对应的属性内容。
属性标识信息可能为空,属性标识信息可能至少包括内容标识位,还可能包括动画区间标识位以及空间缓动参数标识位。内容标识位(exist)用于表示属性对应的属性内容是存在于动态属性数据块中还是等于默认值,动画区间标识位(animatable)用于表示该属性对应的属性值是否包括动画区间特效数据,空间缓动参数标识位(hasSpatial)用于表示该属性对应的属性值是否包括空间缓动参数。不同属性类型的属性所对应的属性标识信息占用的比特位数是动态的,取值范围是0-3比特位。各个属性具体占用了几个比特位,需要根据属性类型确定,也就是说,属性类型可用于确定属性标识信息可能占用的比特位数(0-3位)。普通属性最多只可能占1个比特位,解码时只需要读取内容标识位。而空间缓动动画属性最多会占用3个比特位来存储属性标识信息。例如,当一个空间缓动动画属性不含有动画区间特性数据且属性值等于默认值时,只需要1个比特位来表示属性标识信息,属性标识信息仅包括属性内容标志位,其值为0,表示对应的属性内容为默认值。解码时读取到内容标识位为0,代表该属性的属性标识信息已经读取完毕,不会接着读取下一比特位的值。在极限情况下,属性结构表中各个属性都不含有动画区间特性数据而且都等于默认值,那么只会占用属性数量个比特位存储各个属性对应的属性标识信息,且每个属性标识信息都只包括内容标识位,其值均为0。
下面给出不同属性类型对应的属性标识信息的解析规则:
普通属性的属性标识信息仅占用一个比特位,在读取该属性对应的属性标识信息时,只需要读取一个比特位的值即可。
布尔属性的属性标识信息仅占用一个比特位,在读取该属性对应的属性标识信息时,也只需要读取一个比特位即可,并且,该比特位的值即为该属性对应的属性值。
固定属性的属性标识信息不占用比特位,因此无需从动态属性数据块中读取该属性对应的属性标识信息。
简单动画属性、离散动画属性以及多维时间缓动动画属性的属性标识信息占用1-2个比特位。当读取到第1个比特位的值为1时,代表该属性对应的属性值不是默认值,还需要继续读取第2个比特位,从而得到该属性对应的属性标识信息“11”或“10”,当读取到第1个比特位的值为0时,代表该属性对应的属性值为默认值且属性标识信息只占用1个比特位,即为“1”。
空间缓动动画属性的属性标识信息占用1-3个比特位。当读取到第1个比特位的值为1时,代表该属性对应的属性值不是默认值,还需要继续读取第2个比特位;若第2个比特位的值为0,则该属性对应的属性内容不包括动画区间特性数据,从而得到该属性对应的属性标识信息“10”,不能再去读取后面的数据作为该属性对应的属性标识信息;若第2个比特位的值为1,则该属性对应的属性内容包括动画区间特性数据,还需要继续读取第3个比特位;若第3个比特位的值为0,则该属性对应的属性内容不包括空间缓动参数,并且确定该属性对应的属性标识信息“110”;第3个比特位的值为1,则该属性对应的属性内容包括空间缓动参数,并且确定该属性对应的属性标识信息“111”;若读取到第1个比特位的值为0时,代表该属性对应的属性值为默认值且属性标识信息只占用1个比特位,即为“1”,不能再去读取后面的数据作为该属性对应的属性标识信息。
在一个实施例中,根据属性结构表中各属性对应的属性类型,从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息,包括:查询属性结构表,得到各属性对应的属性排序;根据各属性对应的属性类型,确定各属性对应的属性标识信息所占用的比特位数;从动画标签码对应的动态属性数据块中的首个比特位开始读取数据;基于各属性对应的属性标识信息所占用的比特位数,按照属性排序从依次读取的数据中确定各属性对应的属性标识信息。
实际上,属性结构表所包括属性的数量、属性排序、属性对应的属性类型以及属性对应的默认值都是硬编码在解析代码中的,当解析到某个动画标签码后,可以直接根据解析代码确定与之对应的属性结构表的信息,包括属性排序、属性对应的属性类型、数据类型、数量以及默认值等。
具体地,在从动态属性数据块中解析出各个属性对应的属性标识信息时,是根据各个属性对应的属性类型,先确定各个属性对应的属性标识信息可能占用的比特位数,除此之外,还要按照各个属性对应的属性排序从动态属性数据块的属性标识区域中依次读取数据,并且读取的数据还要按照不同属性类型的属性标识信息的编码规则进行解析,才能准确确定各个属性对应的属性标识信息。
在一个实施例中,当与动画标签码对应的属性结构表中不存在属性类型时,则根据属性结构表中各属性对应的数据类型、属性排序,依次从动画标签码对应的基础属性数据块中读取各属性对应的属性值。
具体地,当动画标签码对应的属性结构表中不存在属性类型时,则表明该动画标签码所对应的节点元素头部后的节点元素内容需要按照基础属性数据结构进行解码,实质上就是按照该动画标签码所对应的属性结构表中各属性对应的数据类型、属性排序对节点元素内容进行解析,依次得到各属性对应的属性值。
比如,当解析到动画标签码的值为“7”时,代表当前节点元素表示的是边框的尺寸和颜色信息,而该信息对应的属性结构表中不存在属性类型,属性结构表中仅包括三个字段,分别为solidColor、width和height,其中solidColor的数据类型为Color,Color类型需要占用三个字节,依次表示红、绿、蓝的值,width、height的数据类型为EncodedInt32。在解码该动画标签码所在的节点元素的节点元素内容时,就需要先读取24bits,得到的是solidColor的值,然后按照EncodedInt32的编码规则依次读取width、height的值,就得到了当前节点元素所要表示的动画信息的各个属性值。
S1406,根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容。
由于属性标识信息标识了各个属性的状态,状态可分为以下几种,比如属性值是默认值还是存在于动态属性数据块的属性内容区域中,又比如,若属性值存在于动态属性数据块的属性内容区域,属性内容是否包括动画区间特性数据,又比如,属性内容是否包括空间缓动参数等。由于不同的状态下对应的属性值的编码方式存在差异,因此,根据各属性对应的属性标识信息确定各属性的状态,也就确定了应该按照什么数据结构从动态属性数据块中解析属性内容,或是如何解析对应的属性值。
具体地,在得到各属性对应的属性标识信息后,就可以按照属性标识信息所标识的属性的状态,采用与各状态对应的解析方式从动态属性数据块中解析出各个属性对应的属性内容。每一种属性类型以及每一种属性类型的属性标识信息取不同值时所对应的解析方式不同,下面进行具体说明。
在一个实施例中,属性类型为普通属性,属性标识信息仅包括内容标识位;根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容,包括:若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,则根据属性对应的数据类型从动态属性数据块中读取属性对应的属性内容;若内容标识位的值表示动态属性数据块中不存在属性对应的属性内容,则从属性结构表中查询与属性对应的默认值。
当属性类型为普通属性时,属性标识信息仅包括内容标识位,也就是说,属性标识信息只占用一个比特位。若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,内容标识位的值比如可以是1,也就是说该属性对应的属性内容不是默认值时,则需要按照该属性对应的数据类型从动态属性数据块中解析出该属性对应的属性内容。若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,内容标识位的值比如可以是0,也就是说该属性对应的属性内容是默认值时,则直接获取该属性对应的默认值,不需要按照该属性对应的数据类型从动态属性数据块中解析出该属性对应的属性内容。
在一个实施例中,属性类型为固定属性,属性标识信息为空;根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容,包括:直接根据属性对应的数据类型从动态属性数据块中读取属性对应的属性内容。
属性类型为固定属性,固定属性的属性标识信息为空,不占用比特位,实际上是因为固定属性对应的属性值肯定存在与动态属性数据块的属性内容区域中,因此可以直接根据该属性对应的数据类型从动态属性数据块中读取该属性对应的属性内容。
在一个实施例中,属性类型为布尔属性,属性标识信息仅包括内容标识位;根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容,包括:直接将内容标识位的值作为属性对应的属性内容。
属性类型为布尔类型,布尔类型的属性只占用一个比特位,且该比特位的值即为该属性对应的值,因此可以直接将该内容标识位的值作为该属性对应的属性值。当该内容标识位的值为1时,该属性对应的属性值为true;当该内容标识位的值为0时,该属性对应的属性值为false。
在一个实施例中,属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性,属性标识信息至少包括内容标识位;根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容,包括:若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,则从动态属性数据块中读取属性对应的属性内容;若内容标识位的值表示动态属性数据块中不存在属性对应的属性内容时,则根据属性结构表查询与属性对应的默认值。
当属性对应的属性类型为简单动画属性(SimpleProperty)、离散动画属性(DiscreteProperty)、多维时间缓动动画属性(MultiDimensionProperty)或空间缓动动画属性(SpatialProperty)时,则该属性对应的属性标识信息至少包括内容标识位。同样地,当解析到内容标识位的值表示属性值不是默认值,也就是表示动态属性数据块中存在属性对应的属性内容时,比如内容标识位的值可以是1,则需要从动态属性数据块中读取属性对应的属性内容。当解析到内容标识位的值表示属性值是默认值,也就是表示动态属性数据块中不存在属性对应的属性内容时,比如内容标识位的值可以是0,则只需要将该属性对应的默认值作为相应的属性内容即可。
在一个实施例中,若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,则从动态属性数据块中读取属性对应的属性内容,包括:当内容标识位的值表示动态属性数据块中存在属性对应的属性内容时,读取内容标识位下一比特位的值,作为动画区间标识位的值;若动画区间标识位的值表示属性内容包括动画区间特性数据时,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的动画区间特性数据;若动画区间标识位的值表示属性内容不包括动画区间特性数据时,则直接根据属性的数据类型从动态属性数据块中解析属性对应的属性内容。
具体地,当内容标识位的值表示动态属性数据块中存在属性对应的属性内容时,比如内容标识位为1时,则该属性对应的属性标识信息至少还包括动画区间标识位,也就是属性标识信息至少占用2个比特位。当读取内容标识位的下一比特位的值(比如1)表示属性内容包括动画区间特性数据,也就是属性标识信息的第2位也为1时,则需要按照动画区间特性数据对应的数据存储结构解析动态属性数据块中与该属性对应的属性内容。当读取内容标识位的下一比特位的值(比如0)表示属性内容不包括动画区间特性数据,也就是属性标识信息的第2位也为0时,也就是属性标识信息为“10”时,则直接按照该属性对应的数据类型解析动态属性数据块中与该属性对应的属性内容。
在一个实施例中,动画区间特性数据对应的数据存储结构所包括的字段包括动画区间数量、各动画区间的插值器类型、各动画区间的起始和结束时间,还包括各动画区间对应属性的起始值、结束值、时间缓动参数和空间缓动参数。
动画区间特性数据对应的数据存储结构可以参考动画数据编码方法中给出的解释。这样的数据存储结构用于存储1个或多个动画区间的动画数据,并且在存储多个动画区间的动画特性数据时,是依次存储每个动画区间的一类数据后再集中存储下一类数据,而不是先存储完一个动画区间的所有数据后再存储下一个动画区间的所有数据,这样做的好处是相似的数据可以集中存储并且可以集中压缩,减小存储空间。
在一个实施例中,属性类型为空间缓动动画属性,若动画区间标识位的值表示属性内容包括动画区间特性数据时,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的动画区间特性数据,包括:当动画区间标识位的值表示属性内容包括动画区间特性数据时,读取动画区间标识位下一比特位的值,作为空间缓动参数标识位的值;若空间缓动参数标识位的值表示动画区间特性数据包括空间缓动参数,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的包括空间缓动参数的动画区间特性数据;若空间缓动参数标识位的值表示动画区间特性数据不包括空间缓动参数,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的不包括空间缓动参数的动画区间特性数据。
其中,空间缓动参数是用于描述复杂动效的参数。只有当属性对应的属性类型为空间缓动动画属性时,该属性对应的属性标识信息才可能占用3个比特位,并且存在空间缓动参数标识位的前提是内容标识位、动画区间标识位均为1。而对于其它属性类型,都不需要判断是否存在第三个标识位,也不需要存储空间缓动参数。
具体地,当动画区间标识位的值表示属性内容包括动画区间特性数据时,比如动画区间标识位为1时,则该属性对应的属性标识信息至少还包括空间缓动参数标识位,也就是属性标识信息占用3个比特位。当读取的动画区间标识位下一比特位的值(比如1)表示属性内容包括空间缓动参数时,也就是属性标识信息的第3位也为1时,即属性标识信息为“111”时,则从动态属性数据块中解析属性对应的包括空间缓动参数的动画区间特性数据,并且空间缓动参数也有对应的编码结构,需要根据相应的编码结构进行解析。当读取的动画区间标识位下一比特位的值(比如0)表示属性内容不包括空间缓动参数时,属性标识信息的第3位为0时,即属性标识信息为“110”时,则从动态属性数据块中解析属性对应的动画区间特性数据不包括空间缓动参数。
需要注意的是,在按照动画区间特性数据的数据存储结构解析属性内容时,具体还需要根据属性类型确定每个动画区间是否存在插值器类型字段(离散动画属性不存在插值器类型字段,因为插值器类型默认为Hold),还要根据解析得到的插值器类型确定动画区间特性数据中是否包括时间缓动参数(因为插值器类型的值不等于Bezier时不存在时间缓动参数),根据属性标识信息确定是否存在空间缓动参数等等。也就是说,动画区间特性数据的数据存储结构中某些字段的值不一定存在,需要结合属性类型、属性标识信息、插值器类型以及动画区间对应的属性值的数据类型等一步步来判断,整个属性内容的存储结构才能逐步清晰化,从而才能从属性内容区域中解析出属性对应的属性内容。对于动画标签码对应的属性结构表中每一个属性对应的属性内容的解析过程,都是按照前面的解析思路执行的。
上述动画数据解码方法,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在解码时,读取到动画标签码后,当该动画标签码对应的属性结构表中存在属性类型时,说明该动画标签码所标识的一组属性的属性值是以动态属性数据块的形式编码的,可以结合各属性对应的属性类型从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息,再基于该属性标识信息可以从动态属性数据块中解析各属性对应的属性内容,实现动画文件的解码。
在一个实施例中,获取动画标签码,包括:解析目标动画文件,得到二进制序列;按照目标动画文件的目标文件结构,依次从二进制序列中读取目标动画文件的文件头编码信息和节点元素编码数据;按照目标动画文件的文件头组织结构所包括字段的排序、各字段的数据类型对文件头编码信息进行解码,得到文件头信息;按照目标动画文件的节点元素组织结构,对节点元素编码数据进行解码,依次得到动画标签码、数据块长度以及各动画标签码对应的数据块;数据块包括动态属性数据块和基础属性数据块。
目标动画文件是PAG文件,PAG文件的文件组织结构包括文件头(FileHeader)和节点元素(Tag)。在编码整个动画文件的数据时,是按照文件头的组织结构将文件头信息进行编码,得到文件头编码信息。节点元素组织结构包括动画标签码、数据块长度以及数据块,对于从动画工程文件中获取的与各动画标签码对应的动画数据,是按照节点元素组织结构依次编码后得到节点元素编码数据。这里的数据块包括动态属性数据块和基础属性数据块。因此,在解析得到目标动画文件的二进制序列后,需要反过来按照文件头组织结构对二进制序列中的文件头编码信息进行解码,得到文件头信息,并按照节点元素组织结构对二进制序列中各节点元素编码数据进行解码,得到节点元素所包括的内容,即动画标签码、数据块长度以及各动画标签码对应的数据块。
在一个实施例中,目标动画文件按照矢量导出方式对动画工程文件进行导出得到;解析目标动画文件,得到二进制序列,包括:获取矢量导出方式所对应的文件数据结构;根据文件数据结构解析目标动画文件,得到表示动画矢量数据的二进制序列。
如图15所示,为一个实施例中矢量导出方式所对应的文件数据结构。参照图15,整个目标动画文件是由所有图层的图层信息合成得到的,VectorComposition表示整个文件,它包括CompositionAttributes和Layer。CompositionAttributes表示动画基础属性数据,包括动画宽度width、高度height等,还包括整个动画的时长duration、帧率framerate、背景颜色backgroundcolor等。Layer表示动画图层数据,包括各个图层对应的数据,在原动画文件中,可能使用了不同类型的图层,可以包括但不限于虚拟对象(NullObjectLayer)、实色图层(SolidLayer)、文本图层(TextLayer)、形状图层(ShapeLayer)、图像图层(ImageLayer)、预合成图层(PreComposeLayer)等。因此,在解析目标动画文件得到的二进制序列,是按照上述图层结构描述图层信息的动画矢量数据。以实色图层为例,对应的描述信息包括图层的宽高、颜色以及图层属性(LayerAttributes),图层属性包括基础属性和动画属性组,基础属性包括图层时长duration,图层起始时间startTime(在播放哪一帧时需要获取使用该图层)和拉伸参数stretch等;动画属性组包括transform、mask、trackMatter、layerStyle、effect和content。一个图层是由这6类动画属性组中任意一种或多种组合得到的。
在一个实施例中,目标动画文件按照位图序列帧导出方式对动画工程文件进行导出得到,解析目标动画文件,得到二进制序列,包括:按照图片解码方式解压目标动画文件,得到目标动画文件对应的图片二进制数据;图片二进制数据包括动画工程文件中关键位图图像的像素数据和非关键位图图像的差异像素区域的像素数据。
具体地,按照位图序列帧导出方式对动画工程文件进行导出得到的目标动画文件,实际上是按照图片编码方式对非关键位图图像对应的差异像素区域以及关键位图图像进行压缩编码得到的一系列编码图片。具体步骤包括:获取动画工程文件对应的位图图像序列;将位图图像序列中的位图图像与对应的关键位图图像进行像素对比,得到位图图像中的差异像素区域;当位图图像为非关键位图图像时,则按照图片编码方式对差异像素区域进行编码,得到位图图像对应的编码图片;当位图图像为关键位图图像时,则直接采用图片编码方式对位图图像进行编码,得到位图图像对应的编码图片;根据位图图像序列中各位图图像对应的编码图片生成动画工程文件对应的目标动画文件。
因此,在解析该目标动画文件时,需要按照相应的图片解码方式对目标动画文件进行解码,得到目标动画文件对应的图片二进制序列,该图片二进制数据包括动画工程文件中关键位图图像的像素数据和非关键位图图像的差异像素区域的像素数据。
在一个实施例中,目标动画文件按照视频序列帧导出方式对动画工程文件进行导出得到,解析目标动画文件,得到二进制序列,包括:按照视频解码方式解压目标动画文件,得到目标动画文件对应的图片二进制数据;图片二进制数据为合成位图的像素数据,合成位图是通过将动画工程文件所包括位图图像的颜色通道位图和透明度通道位图进行合成处理后得到的。
具体地,按照视频序列帧导出方式对动画工程文件进行导出得到的目标动画文件的处理过程具体如下:获取动画工程文件对应的位图图像序列;将位图图像序列中各位图图像划分成颜色通道位图、透明度通道位图;合成颜色通道位图和透明度通道位图,得到合成位图;按照视频编码方式对合成位图进行编码,得到位图图像对应的编码图片;根据位图图像序列中各位图图像对应的编码图片生成动画工程文件对应的目标动画文件。
因此,在解析该目标动画文件时,需要按照相应的视频解码方式对目标动画文件进行解码,得到目标动画文件对应的合成位图对应的图片二进制数据。
在一个实施例中,如图16所示,提供了一种动画数据编码装置1600,该装置包括动画数据获取模块1602、属性标识信息确定模块1604、属性内容编码模块1606和数据块生成模块1608,其中:
动画数据获取模块1602,用于从动画工程文件中获取与各动画标签码对应的动画数据;
属性标识信息确定模块1604,用于当与动画标签码对应的属性结构表中存在属性类型时,则确定各属性对应的属性标识信息;
属性内容编码模块1606,用于按照属性标识信息,对动画数据中与各属性对应的属性值进行编码,得到各属性对应的属性内容;
数据块生成模块1608,用于根据属性结构表中各属性对应的属性排序,将各属性对应的属性标识信息、属性内容依次存储,得到动画标签码对应的动态属性数据块。
在一个实施例中,动画数据编码装置1600还包括基础属性数据块生成模块,用于当与动画标签码对应的属性结构表中不存在属性类型时,则根据属性结构表中各属性对应的数据类型、属性排序,依次对动画数据中与各属性对应的属性值进行编码,得到动画标签码对应的基础属性数据块。
在一个实施例中,属性对应的属性类型为普通属性或布尔属性,属性对应的属性标识信息仅包括内容标识位;属性标识信息确定模块1604还用于若动画数据中与属性对应的属性值不是默认值时,则将内容标识位编码成表示动态属性数据块中存在与属性对应的属性内容的值;若动画数据中与属性对应的属性值是默认值时,则将内容标识位编码成表示动态属性数据块中不存在与属性对应的属性内容的值。
在一个实施例中,属性对应的属性类型为固定属性,属性标识信息为空;属性内容编码模块1606还用于直接根据属性对应的数据类型对动画数据中与属性对应的属性值进行编码,得到属性对应的属性内容。
在一个实施例中,属性对应的属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性,属性标识信息至少包括内容标识位;属性标识信息确定模块1604还用于若动画数据中与属性对应的属性值不是默认值时,则将内容标识位编码成表示动态属性数据块中存在与属性对应的属性内容的值;若动画数据中与属性对应的属性值是默认值时,则将内容标识位编码成表示动态属性数据块中不存在与属性对应的属性内容的值。
在一个实施例中,属性标识信息还包括动画区间标识位;当内容标识位的值表示动态属性数据块中存在与属性对应的属性内容时,属性标识信息确定模块1604还用于若属性值包括动画区间特性数据时,则将动画区间标识位编码成表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据的值;若属性值不包括动画区间特性数据时,则将动画区间标识位编码成表示动态属性数据块中存储的与属性对应的属性内容不包括动画区间特性数据的值。
在一个实施例中,属性内容编码模块1606还用于若动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据,则按照动画区间特性数据对应的数据存储结构,对属性对应的动画区间特性数据进行编码,得到与属性对应的属性内容;若动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容不包括动画区间特性数据,则直接根据属性对应的数据类型,对动画数据中与属性对应的属性值进行编码,得到属性对应的属性内容。
在一个实施例中,属性对应的属性类型为空间缓动动画属性,属性标识信息还包括空间缓动参数标识位;当动画区间标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括动画区间特性数据时,属性标识信息确定模块1604还用于若动画区间特性数据包括空间缓动参数,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容包括空间缓动参数的值;若动画区间特性数据不包括空间缓动参数时,则将空间缓动参数标识位编码成动态属性数据块中存储的与属性对应的属性内容不包括空间缓动参数的值。
在一个实施例中,属性内容编码模块1606还用于当空间缓动参数标识位的值表示动态属性数据块中存储的与属性对应的属性内容包括空间缓动参数时,则按照动画区间特性数据对应的数据存储结构,对属性对应的动画区间特性数据进行编码,得到与属性对应的包括空间缓动参数的属性内容,否则,得到与属性对应的不包括空间缓动参数的属性内容。
在一个实施例中,动画区间特性数据对应的数据存储结构所包括的字段包括动画区间数量、各动画区间的插值器类型、各动画区间的起始和结束时间,还包括各动画区间对应属性的起始值、结束值、时间缓动参数和空间缓动参数。
在一个实施例中,动画标签码为位图合成标签码;动画数据获取模块1602还用于播放动画工程文件;依次对动画工程文件对应的播放画面进行截图,得到动画工程文件对应的位图图像序列;按照位图序列帧导出方式对位图图像序列进行处理,得到位图合成标签码对应的图片二进制数据。
在一个实施例中,动画标签码为视频合成标签码;动画数据获取模块1602还用于播放动画工程文件;依次对动画工程文件对应的播放画面进行截图,得到动画工程文件对应的位图图像序列;按照视频序列帧导出方式对位图图像序列进行处理,得到视频合成标签码对应的图片二进制数据。
在一个实施例中,动画数据编码装置1600还包括文件头信息编码模块、节点元素编码模块和目标动画文件生成模块,文件头信息编码模块用于按照文件头组织结构,将文件头信息依次编码,得到文件头编码信息;节点元素编码模块用于按照节点元素组织结构,将动画标签码、数据块长度和数据块依次编码,得到节点元素编码数据;数据块包括动态属性数据块和基础属性数据块;目标动画文件生成模块用于将文件头编码信息、各节点元素编码数据按照目标文件结构进行组织,得到目标动画文件。
上述动画数据编码装置中,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在获取到动画工程文件后,按照动画标签码对应的属性结构表所包括的一组属性,从动画工程文件中获取这一组属性的属性值,动态属性数据块中的属性标识信息用于描述属性的属性状态,当属性结构表中存在属性类型时,可以根据动画数据确定各个属性对应的属性标识信息,再按照属性标识信息对各属性对应的属性值进行动态编码得到对应的属性内容,结合属性结构表中各属性的属性标识信息和属性内容得到动画标签码对应的动态属性数据块,可以显著减少动画文件占用的空间。
在一个实施例中,如图17所示,提供了一种动画数据解码装置1700,该装置包括获取模块1702、属性标识信息解析模块1704、属性内容解析模块1706,其中:
获取模块1702,用于获取动画标签码;
属性标识信息解析模块1704,用于当与动画标签码对应的属性结构表中存在属性类型时,则根据属性结构表中各属性对应的属性类型,从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息;
属性内容解析模块1706,用于根据各属性对应的属性标识信息从动态属性数据块中解析各属性对应的属性内容。
在一个实施例中,动画数据解码装置1700还包括基础属性数据块解析模块,用于当与动画标签码对应的属性结构表中不存在属性类型时,则根据属性结构表中各属性对应的数据类型、属性排序,依次从动画标签码对应的基础属性数据块中读取各属性对应的属性值。
在一个实施例中,属性标识信息解析模块1704还用于查询属性结构表,得到各属性对应的属性排序;根据各属性对应的属性类型,确定各属性对应的属性标识信息所占用的比特位数;从动画标签码对应的动态属性数据块中的首个比特位开始读取数据;基于各属性对应的属性标识信息所占用的比特位数,按照属性排序从依次读取的数据中确定各属性对应的属性标识信息。
在一个实施例中,属性类型为普通属性,属性标识信息仅包括内容标识位;属性内容解析模块1706还用于若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,则根据属性对应的数据类型从动态属性数据块中读取属性对应的属性内容;若内容标识位的值表示动态属性数据块中不存在属性对应的属性内容,则从属性结构表中查询与属性对应的默认值。
在一个实施例中,属性类型为固定属性,属性标识信息为空;属性内容解析模块1706还用于直接根据属性对应的数据类型从动态属性数据块中读取属性对应的属性内容。
在一个实施例中,属性类型为布尔属性,属性标识信息仅包括内容标识位;属性内容解析模块1706还用于直接将内容标识位的值作为属性对应的属性内容。
在一个实施例中,属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性,属性标识信息至少包括内容标识位;属性内容解析模块1706还用于若内容标识位的值表示动态属性数据块中存在属性对应的属性内容,则从动态属性数据块中读取属性对应的属性内容;若内容标识位的值表示动态属性数据块中不存在属性对应的属性内容时,则根据属性结构表查询与属性对应的默认值。
在一个实施例中,属性内容解析模块1706还用于当内容标识位的值表示动态属性数据块中存在属性对应的属性内容时,读取内容标识位下一比特位的值,作为动画区间标识位的值;若动画区间标识位的值表示属性内容包括动画区间特性数据时,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的动画区间特性数据;若动画区间标识位的值表示属性内容不包括动画区间特性数据时,则直接根据属性的数据类型从动态属性数据块中解析属性对应的属性内容。
在一个实施例中,属性类型为空间缓动动画属性,属性内容解析模块1706还用于当动画区间标识位的值表示属性内容包括动画区间特性数据时,读取动画区间标识位下一比特位的值,作为空间缓动参数标识位的值;若空间缓动参数标识位的值表示动画区间特性数据包括空间缓动参数,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的包括空间缓动参数的动画区间特性数据;若空间缓动参数标识位的值表示动画区间特性数据不包括空间缓动参数,则按照动画区间特性数据对应的数据存储结构,从动态属性数据块中解析属性对应的不包括空间缓动参数的动画区间特性数据。
在一个实施例中,动画区间特性数据对应的数据存储结构所包括的字段包括动画区间数量、各动画区间的插值器类型、各动画区间的起始和结束时间,还包括各动画区间对应属性的起始值、结束值、时间缓动参数和空间缓动参数。
在一个实施例中,获取模块1702还包括目标动画文件解析模块、文件头信息解析模块和节点元素解析模块,目标动画文件解析模块用于解析目标动画文件,得到二进制序列;按照目标动画文件的目标文件结构,依次从二进制序列中读取目标动画文件的文件头编码信息和节点元素编码数据;文件头信息解析模块用于按照目标动画文件的文件头组织结构所包括字段的排序、各字段的数据类型对文件头编码信息进行解码,得到文件头信息;节点元素解析模块用于按照目标动画文件的节点元素组织结构,对节点元素编码数据进行解码,依次得到动画标签码、数据块长度以及各动画标签码对应的数据块;数据块包括动态属性数据块和基础属性数据块。
在一个实施例中,目标动画文件按照矢量导出方式对动画工程文件进行导出得到;目标动画文件解析模块还用于获取矢量导出方式所对应的文件数据结构;根据文件数据结构解析目标动画文件,得到表示动画矢量数据的二进制序列。
在一个实施例中,目标动画文件按照位图序列帧导出方式对动画工程文件进行导出得到,目标动画文件解析模块还用于按照图片解码方式解压目标动画文件,得到目标动画文件对应的图片二进制数据;图片二进制数据包括动画工程文件中关键位图图像的像素数据和非关键位图图像的差异像素区域的像素数据。
在一个实施例中,目标动画文件按照视频序列帧导出方式对动画工程文件进行导出得到,目标动画文件解析模块还用于按照视频解码方式解压目标动画文件,得到目标动画文件对应的图片二进制数据;图片二进制数据为合成位图的像素数据,合成位图是通过将动画工程文件所包括位图图像的颜色通道位图和透明度通道位图进行合成处理后得到的。
上述动画数据解码装置1700中,动画标签码可用于标识一组属性,属性结构表用于描述动画标签码所标识的一组属性的数据结构,当这一组属性的属性值从种类或数量都不确定,或者当属性的属性值存在大量冗余时,为了避免额外引入大量的用于描述属性种类或数量的标识符字段导致动画文件体积太大的问题,引入了动态属性数据块的数据结构,可以最大化压缩这些标识符,大大减小目标动画文件占用的体积。具体地,在解码时,读取到动画标签码后,当该动画标签码对应的属性结构表中存在属性类型时,说明该动画标签码所标识的一组属性的属性值是以动态属性数据块的形式编码的,可以结合各属性对应的属性类型从动画标签码对应的动态属性数据块中解析各属性对应的属性标识信息,再基于该属性标识信息可以从动态属性数据块中解析各所述属性对应的属性内容,实现动画文件的解码。
图18示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图18所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器和存储器。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现动画数据编码方法或动画数据解码方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行动画数据编码方法或动画数据解码方法。
本领域技术人员可以理解,图18中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的动画数据编码装置1600可以实现为一种计算机程序的形式,计算机程序可在如图18所示的计算机设备上运行。计算机设备的存储器中可存储组成该动画数据编码装置1600的各个程序模块,比如,图16所示的动画数据获取模块1602、属性标识信息确定模块1604、属性内容编码模块1606和数据块生成模块1608。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的动画数据编码方法中的步骤。
例如,图18所示的计算机设备可以通过如图16所示的动画数据编码装置1600中的动画数据获取模块1602执行步骤S802。计算机设备可通过属性标识信息确定模块1604执行步骤S804。计算机设备可通过属性内容编码模块1606执行步骤S1606。计算机设备可通过数据块生成模块1608执行步骤S1608。
在一个实施例中,本申请提供的动画数据解码装置1700可以实现为一种计算机程序的形式,计算机程序可在如图18所示的计算机设备上运行。计算机设备的存储器中可存储组成该动画数据解码装置1700的各个程序模块,比如,图17所示的包括获取模块1702、属性标识信息解析模块1704、属性内容解析模块1706。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的动画数据编码方法中的步骤。
例如,图18所示的计算机设备可以通过如图17所示的动画数据解码装置1700中的获取模块1702执行步骤S1402。计算机设备可通过属性标识信息解析模块1704执行步骤S1404。计算机设备可通过属性内容解析模块1706执行步骤S1406。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述动画数据编码方法的步骤。此处动画数据编码方法的步骤可以是上述各个实施例的动画数据编码方法中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述动画数据编码方法的步骤。此处动画数据编码方法的步骤可以是上述各个实施例的动画数据解码方法中的步骤。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述动画数据解码方法的步骤。此处动画数据解码方法的步骤可以是上述各个实施例的动画数据解码方法中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述动画数据解码方法的步骤。此处动画数据解码方法的步骤可以是上述各个实施例的动画数据解码方法中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (15)
1.一种动画数据解码方法,包括:
获取动画标签码;
当与所述动画标签码对应的属性结构表中不存在属性类型时,则
根据所述属性结构表中各属性对应的数据类型、属性排序,依次从所述动画标签码对应的基础属性数据块中读取各所述属性对应的属性值。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当与所述动画标签码对应的属性结构表中存在属性类型时,则
根据各所述属性对应的属性类型,确定各所述属性对应的属性标识信息所占用的比特位数;
从所述动画标签码对应的动态属性数据块中的首个比特位开始读取数据;
基于各所述属性对应的属性标识信息所占用的比特位数,按照所述属性结构表中各所述属性对应的属性排序,从依次读取的数据中确定各所述属性对应的属性标识信息;
根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容。
3.根据权利要求2所述的方法,其特征在于,所述属性类型为普通属性,所述属性标识信息仅包括内容标识位;所述根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容,包括:
当所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容时,则根据所述属性对应的数据类型从所述动态属性数据块中读取所述属性对应的属性内容;
当所述内容标识位的值表示所述动态属性数据块中不存在所述属性对应的属性内容时,则从所述属性结构表中查询与所述属性对应的默认值。
4.根据权利要求2所述的方法,其特征在于,所述属性类型为固定属性,所述属性标识信息为空;所述根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容,包括:
直接根据所述属性对应的数据类型从所述动态属性数据块中读取所述属性对应的属性内容。
5.根据权利要求2所述的方法,其特征在于,所述属性类型为布尔属性,所述属性标识信息仅包括内容标识位;所述根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容,包括:
直接将所述内容标识位的值作为所述属性对应的属性内容。
6.根据权利要求2所述的方法,其特征在于,所述属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性,所述属性标识信息至少包括内容标识位;所述根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容,包括:
当所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容,则从所述动态属性数据块中读取所述属性对应的属性内容;
当所述内容标识位的值表示所述动态属性数据块中不存在所述属性对应的属性内容时,则根据所述属性结构表查询与所述属性对应的默认值。
7.根据权利要求6所述的方法,其特征在于,所述若所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容,则从所述动态属性数据块中读取所述属性对应的属性内容,包括:
当所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容时,读取所述内容标识位下一比特位的值,作为动画区间标识位的值;
在所述动画区间标识位的值表示所述属性内容包括动画区间特性数据时,则按照所述动画区间特性数据对应的数据存储结构,从所述动态属性数据块中解析所述属性对应的动画区间特性数据;
在所述动画区间标识位的值表示所述属性内容不包括动画区间特性数据时,则直接根据所述属性的数据类型从所述动态属性数据块中解析所述属性对应的属性内容。
8.根据权利要求7所述的方法,其特征在于,所述属性类型为空间缓动动画属性,所述若所述动画区间标识位的值表示所述属性内容包括动画区间特性数据时,则按照所述动画区间特性数据对应的数据存储结构,从所述动态属性数据块中解析所述属性对应的动画区间特性数据,包括:
当所述动画区间标识位的值表示所述属性内容包括动画区间特性数据时,读取所述动画区间标识位下一比特位的值,作为空间缓动参数标识位的值;
在所述空间缓动参数标识位的值表示所述动画区间特性数据包括空间缓动参数时,则按照所述动画区间特性数据对应的数据存储结构,从所述动态属性数据块中解析所述属性对应的包括所述空间缓动参数的动画区间特性数据;
在所述空间缓动参数标识位的值表示所述动画区间特性数据不包括空间缓动参数时,则按照所述动画区间特性数据对应的数据存储结构,从所述动态属性数据块中解析所述属性对应的不包括所述空间缓动参数的动画区间特性数据。
9.根据权利要求8所述的方法,其特征在于,所述动画区间特性数据对应的数据存储结构所包括的字段包括动画区间数量、各动画区间的插值器类型、各所述动画区间的起始和结束时间,还包括各所述动画区间对应所述属性的起始值、结束值、时间缓动参数和空间缓动参数。
10.一种动画数据解码装置,所述装置包括:
获取模块,用于获取动画标签码;
基础属性数据块解析模块,用于当与所述动画标签码对应的属性结构表中不存在属性类型时,则根据所述属性结构表中各属性对应的数据类型、属性排序,依次从所述动画标签码对应的基础属性数据块中读取各所述属性对应的属性值。
11.根据权利要求10所述的装置,其特征在于,所述装置还包括:
属性标识信息解析模块,用于当与所述动画标签码对应的属性结构表中存在属性类型时,则根据各所述属性对应的属性类型,确定各所述属性对应的属性标识信息所占用的比特位数;从所述动画标签码对应的动态属性数据块中的首个比特位开始读取数据;基于各所述属性对应的属性标识信息所占用的比特位数,按照所述属性结构表中各所述属性对应的属性排序,从依次读取的数据中确定各所述属性对应的属性标识信息;
属性内容解析模块,用于根据各所述属性对应的属性标识信息从所述动态属性数据块中解析各所述属性对应的属性内容。
12.根据权利要求11所述的装置,其特征在于,所述属性类型为普通属性,所述属性标识信息仅包括内容标识位;
属性内容解析模块还用于当所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容时,则根据所述属性对应的数据类型从所述动态属性数据块中读取所述属性对应的属性内容;当所述内容标识位的值表示所述动态属性数据块中不存在所述属性对应的属性内容时,则从所述属性结构表中查询与所述属性对应的默认值。
13.根据权利要求11所述的装置,其特征在于,所述属性类型为简单动画属性、离散动画属性、多维时间缓动动画属性或空间缓动动画属性;
属性内容解析模块还用于当所述内容标识位的值表示所述动态属性数据块中存在所述属性对应的属性内容,则从所述动态属性数据块中读取所述属性对应的属性内容;当所述内容标识位的值表示所述动态属性数据块中不存在所述属性对应的属性内容时,则根据所述属性结构表查询与所述属性对应的默认值。
14.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至9中任一项所述方法的步骤。
15.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至9中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910502800.6A CN112070850A (zh) | 2019-06-11 | 2019-06-11 | 动画数据编码、解码方法、装置、存储介质和计算机设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910502800.6A CN112070850A (zh) | 2019-06-11 | 2019-06-11 | 动画数据编码、解码方法、装置、存储介质和计算机设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112070850A true CN112070850A (zh) | 2020-12-11 |
Family
ID=73658475
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910502800.6A Pending CN112070850A (zh) | 2019-06-11 | 2019-06-11 | 动画数据编码、解码方法、装置、存储介质和计算机设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112070850A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114596185A (zh) * | 2022-01-20 | 2022-06-07 | 广州市百果园信息技术有限公司 | 动画数据存储方法、系统、设备及存储介质 |
-
2019
- 2019-06-11 CN CN201910502800.6A patent/CN112070850A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114596185A (zh) * | 2022-01-20 | 2022-06-07 | 广州市百果园信息技术有限公司 | 动画数据存储方法、系统、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112150587A (zh) | 动画数据编码、解码方法、装置、存储介质和计算机设备 | |
CN111899155B (zh) | 视频处理方法、装置、计算机设备及存储介质 | |
WO2020125567A1 (zh) | 一种动画自动生成方法及动画自动生成系统 | |
CN111899322B (zh) | 视频处理方法、动画渲染sdk和设备及计算机存储介质 | |
WO2020248948A1 (zh) | 动画文件处理方法、装置、计算机可读存储介质和计算机设备 | |
CN111161365B (zh) | 一种骨骼动画数据的压缩方法及装置 | |
CN112070866A (zh) | 动画数据编码、解码方法、装置、存储介质和计算机设备 | |
CN112070863A (zh) | 动画文件处理方法、装置、计算机可读存储介质和计算机设备 | |
CN112579086B (zh) | 一种适配多平台前端View的模板构建方法 | |
CN110113617A (zh) | 一种图像压缩与解压缩的方法及装置 | |
AU2018233015B2 (en) | System and method for image processing | |
CN115908613B (zh) | 基于人工智能的ai模型生成方法、系统及存储介质 | |
CN105513115A (zh) | 将SWF转化为Canvas动画的方法和装置 | |
CN111246122A (zh) | 一种多张照片合成视频的方法和装置 | |
CN105512235A (zh) | 一种GIS与AutoCAD数据交换方法及中间文件 | |
CN112070850A (zh) | 动画数据编码、解码方法、装置、存储介质和计算机设备 | |
CN112150585A (zh) | 动画数据编码、解码方法、装置、存储介质和计算机设备 | |
CN102572219A (zh) | 移动终端及其图像处理方法 | |
KR100882250B1 (ko) | 동적인 가상 이미지를 합성하기 위한 방법 | |
CN110012338A (zh) | 一种显示弹幕数据的方法、装置、计算机设备和存储介质 | |
CN112150589A (zh) | 动画数据编码、解码方法、装置、存储介质和计算机设备 | |
US9412187B2 (en) | Delayed rendering of content | |
CN113157275B (zh) | 帧动画的渲染方法、装置、电子设备及存储介质 | |
Zhang | The studies and implementation for conversion of image file format | |
CN115250335A (zh) | 视频处理方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |