一种基于H.264视频压缩标准的码流封装方法转让专利

申请号 : CN201811423867.2

文献号 : CN109600616B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 赵亦工卫林霄

申请人 : 西安汇明科技发展有限责任公司

摘要 :

本发明属于图像处理技术领域,公开了一种基于H.264视频压缩标准的码流封装方法。该方法包括:获取VCL数据序列;根据H.264视频压缩标准,将视频对应的序列参数集封装在第一网络适配层NAL单元,将视频对应的图像参数集封装在第二NAL单元,确定组成视频的第i帧图像对应的VCL数据,按照H.264视频压缩标准,将第i帧图像对应的VCL数据封装在第三NAL单元;添加起始码,按照码流方式输出。本发明能够得到可直接解码的码流,同时考虑了硬件存储空间限制和实时性的要求,可用于硬件实现方案。

权利要求 :

1.一种基于H.264视频压缩标准的码流封装方法,其特征在于,包括:

获取视频的视频编码层VCL数据序列,所述VCL数据序列包含N帧图像的VCL数据,每个VCL数据为16位,其高8位表示该VCL数据所属图像的帧号,低8位表示该VCL数据所属图像的编码码流;M为组成所述视频的图像帧数,M为整数且N大于1;

根据H.264视频压缩标准,将所述视频对应的序列参数集封装在第一网络适配层NAL单元,将所述视频对应的图像参数集封装在第二NAL单元;所述第一NAL单元的头信息用于标识所述视频的序列参数集,所述第一NAL单元的原始字节序列负荷RBSP对应所述视频的序列参数集;所述第二NAL单元的头信息用于标识所述视频的图像参数集,所述第二NAL单元的RBSP对应所述视频的图像参数集;

根据所述视频的VCL数据序列,确定组成所述视频的第i帧图像对应的VCL数据;将所述第i帧图像作为一个片层,并按照H.264视频压缩标准,将所述第i帧图像对应的VCL数据封装在第三NAL单元;所述第三NAL单元的头信息用于标识所述片层,所述第三NAL单元的RBSP对应所述片层的片头及片层数据;i依次取1到M之间的整数;在编码得到所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据之后,即为所述第一NAL单元、所述第二NAL单元和所述第三NAL单元添加起始码,并以码流形式输出所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据,并记录所述片头的编码数据最后不足8位的剩余编码数据,记剩余编码数据的位数为N;

在编码得到所述第三NAL单元的RBSP中片层数据的编码数据之后,将所述片头对应的编码数据的剩余编码数据与所述第i帧图像对应的第一个VCL数据的前8‑N位编码数据组合为8比特数,并输出,同时记录所述第i帧图像对应的第一个VCL数据剩余的N位编码数据;将所述第i帧图像对应的第一个VCL数据剩余的N位编码数据与所述第i帧图像对应的第二个VCL数据的前8‑N位编码数据组合为8比特数,并输出, 如此直至所述第i帧图像对应的最后一个VCL数据剩余N位编码数据,对所述最后一个VCL数据的剩余N位编码数据添加尾比特后输出。

2.根据权利要求1所述的方法,其特征在于,在输出所述第一NAL单元的RBSP、所述第二NAL单元的RBSP或所述第三NAL单元的RBSP之前,所述方法还包括:检测所述第一NAL单元的RBSP、所述第二NAL单元的RBSP或所述第三NAL单元的RBSP中是否包含字节序列0x000000、0x000001、0x000002或者0x000003,并在检测到包含字节序列

0x000000、0x000001、0x000002或者0x000003时,替换为对应的新字节序列0x00000300、

0x00000301、0x00000302以及0x000003。

3.根据权利要求1或2所述的方法,其特征在于,所述起始码为0x000000。

说明书 :

一种基于H.264视频压缩标准的码流封装方法

技术领域

[0001] 本发明涉及图像处理技术领域,尤其涉及一种基于H.264视频压缩标准的码流封装方法。

背景技术

[0002] 随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性。但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动清晰的媒体演示的同时,不得不为等待传输文件而花费大量时间。为了解决这个矛盾,一种新的媒体技术应运而生,这就是流媒体技术。
[0003] H.264/AVC是新一代的视频编码标准,它具有高的压缩比,良好的网络适应性和比较高的传输可靠性。H.264的基本流的结构分为两层,包括视频编码层(Video Coding Layer,VCL)和网络适配层(Network Abstraction Layer,NAL)。视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。引入NAL并使之与VCL分离带来的好处包括两方面:其一、使信号处理和网络传输分离,VCL和NAL可以在不同的处理平台上实现;其二、VCL和NAL分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。VCL数据即被压缩编码后的视频数据序列。VCL数据要在封装到NAL单元中之后,才可以用来传输或存储。每个NAL单元包括一个原始字节序列负荷(Raw Byte Sequence Payload,RBSP)和一组对应于视频编码数据的NAL头信息。
[0004] 在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义,例如:宏块类型、量化参数等。码流是由一个个句法元素依次衔接组成的,码流中除了句法元素并不存在专门用于控制或同步的内容。在H.264定义的码流中,句法元素被组织成有层次的结构,分别描述各个层次的信息,共有序列、图像、片、宏块、子宏块五个层次。
[0005] 现有H.264视频压缩标准的实现方案多是基于软件的,其硬件实现方案较少,目前只有复旦大学的一个团队在近期开源的一款H.264视频编码IP核。然而,发明人人发现,该IP核最终仅仅只得到了VCL码流,并没有将VCL码流封装为NAL单元,因此解码器无法对该IP核输出的编码码流进行解码。

发明内容

[0006] 有鉴于此,本发明提出了一种基于H.264视频压缩标准的码流封装方法,通过将VCL层码流封装为NAL单元,能够得到可直接解码的码流,同时考虑了硬件存储空间限制和实时性的要求,可用于硬件实现方案。
[0007] 为达到上述目的,本发明的实施例采用如下技术方案:
[0008] 提供一种基于H.264视频压缩标准的码流封装方法,包括:
[0009] 获取视频的视频编码层VCL数据序列,所述VCL数据序列包含M帧图像的VCL数据,每个VCL数据为16位,其高8位表示该VCL数据所属图像的帧号,低8位表示该VCL数据所属图像的编码码流;M为组成所述视频的图像帧数,M为整数且M大于1;
[0010] 根据H.264视频压缩标准,将所述视频对应的序列参数集封装在第一网络适配层NAL单元,将所述视频对应的图像参数集封装在第二NAL单元;所述第一NAL单元的头信息用于标识所述视频的序列参数集,所述第一NAL单元的原始字节序列负荷RBSP对应所述视频的序列参数集;所述第二NAL单元的头信息用于标识所述视频的图像参数集,所述第二NAL单元的RBSP对应所述视频的图像参数集;
[0011] 根据所述视频的VCL数据序列,确定组成所述视频的第i帧图像对应的VCL数据;将所述第i帧图像作为一个片层,并按照H.264视频压缩标准,将所述第i帧图像对应的VCL数据封装在第三NAL单元;所述第三NAL单元的头信息用于标识所述片层,所述第三NAL单元的RBSP对应所述片层的片头及片层数据;i依次取1到M之间的整数;
[0012] 在编码得到所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据之后,即为所述第一NAL单元、所述第二NAL单元和所述第三NAL单元添加起始码,并以码流形式输出所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据,并记录所述片头的编码数据最后不足8位的剩余编码数据,记剩余编码数据的位数为N;
[0013] 在编码得到第三NAL单元的RBSP中片层数据的编码数据之后,将所述片头对应的编码数据的剩余编码数据与所述第i帧图像对应的第一个VCL数据的前8‑N位编码数据组合为8比特数,并输出,同时记录所述第i帧图像对应的第一个VCL数据剩余的N位编码数据;将所述第i帧图像对应的第一个VCL数据剩余的N位编码数据与所述第i帧图像对应的第二个VCL数据的前8‑N位编码数据组合为8比特数,并输出……如此直至所述第i帧图像对应的最后一个VCL数据剩余N位编码数据,对所述最后一个VCL数据的剩余N位编码数据添加尾比特后输出。
[0014] 基于本发明上述方案,通过约定输入的VCL数据的格式,即约定每个VCL数据的高8位表示该VCL数据所属图像的帧号,低8位表示该VCL数据所属图像的编码码流,能够判断确定一帧码流的起始位置,从而将每一帧图像的VCL层码流封装为3个NAL单元,从而使解码器能够得到可直接解码的码流;同时,本发明方案在编码的同时即按照码流方式对编码数据依次输出,因此在满足实时性要求的同时,能够化解硬件系统存储空间有限的问题,可用于硬件实现方案。

附图说明

[0015] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0016] 图1为本发明实施例提供的一种基于H.264视频压缩标准的码流封装方法的流程示意图;
[0017] 图2为一帧码流封装的NAL单元序列示意图;
[0018] 图3为片头与片层数据相接部分的示意图。

具体实施方式

[0019] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0020] 图1所示为本发明实施例提供的一种基于H.264视频压缩标准的码流封装方法,包括以下步骤:
[0021] 步骤1,获取视频的VCL数据序列。
[0022] 其中,所述VCL数据序列包含N帧图像的VCL数据,每个VCL数据为16位,其高8位表示该VCL数据所属图像的帧号,低8位表示该VCL数据所属图像的编码码流,M为组成所述视频的图像帧数,M为整数且M大于1。
[0023] 由于码流本身只是单纯的数据,不携带可以用于判断的特征,仅仅依靠码流本身是无法判断的,因此约定FPGA程序中输出码流时需要将码流对应的帧号一同存储,即数据的低8位表示码流,高8位表示帧号。在对码流进行封装操作时,先读取数据并根据不同位数将其分为码流数据和帧号,对帧号进行判断,帧号发生变化的时候即为新一帧码流的起始位置。
[0024] 找到了新一帧的起始位置,接下来就是要将码流封装为各个NAL单元,首先要进行的是添加序列参数集和图像参数集的相关操作,即如下所述的步骤2:
[0025] 步骤2,根据H.264视频压缩标准,将所述视频对应的序列参数集封装在第一NAL单元,将所述视频对应的图像参数集封装在第二NAL单元。
[0026] 其中,所述第一NAL单元的头信息用于标识所述视频的序列参数集,所述第一NAL单元的RBSP对应所述视频的序列参数集;所述第二NAL单元的头信息用于标识所述视频的图像参数集,所述第二NAL单元的RBSP对应所述视频的图像参数集。
[0027] 示例性的,给出编码第一NAL单元头信息的句法元素如下:首先是以f(1)形式编码的forbidden_zero_bit,其值为0,编码方式f(n)是指n位固定模式比特串。然后是以u(2)形式编码的nal_ref_idc,根据相应语义,在序列参数集时对其取3,编码方式u(n)是指n位无符号整数,如果规定的编码方式为u(v),则其比特数由其他语法元素值确定。最后是以u(5)形式编码的nal_unit_type,它是指包含在NAL单元中的RBSP数据结构的类型,可以通过查表得到相应的值,序列参数集的nal_unit_type值为7。NAL单元的几个句法元素编码后刚好组合为一个8比特的数据。添加图像参数集和片头时也需要进行此步骤。
[0028] 此外,对于序列参数集的各个句法元素,需要根据H.264规范规定的编码方式进行相应编码,除了上述提到的f(n)和u(n)两种编码方式外,还有几种序列参数集、图像参数集和片头的句法元素使用到的编码方式。例如,b(8)表示任意形式的8比特字节,ue(v)表示无符号整数指数哥伦布编码,se(v)表示有符号整数指数哥伦布编码。
[0029] 与NAL单元头部的句法元素编码类似,在对序列参数集进行编码时,首先需要明确用于编码的各个句法元素的含义和赋值,以及它们相应的编码方式。在对H.264帧内压缩编码的码流添加序列参数集时,由于有些句法元素在解码时不会使用,所以并非对于每一个句法元素都有严格的要求,有些设置为默认值就可以。需要注意的是pic_width_in_mbs_minus1和pic_height_in_map_units_minus1两个句法元素,编码方式位ue(v),它们分别表示以宏块为单位的图像宽度和高度减1,对解码至关重要。
[0030] 在对序列参数集编码完成后,依次将其拼接为8比特的字节存储在数组中,即第一个字节包括最开始8比特,下一个字节应包括接下来的8比特,直到序列参数集最后一个句法元素剩余的编码位数少于8比特。在最后一个句法元素的编码之后需要添加尾比特,即编码之后的下一个比特为单个rbsp_stop_one_bit,其值为1,并且当rbsp_stop_one_bit不是一个字节对齐的字节的最后一个比特时,一个或更多的值为0的rbsp_alignment_zero_bit就会出现以形成一个字节对齐。
[0031] 对于图像参数集的操作与序列参数集相同,即按照上述步骤编码相应的第二NAL单元。
[0032] 步骤3,根据所述视频的VCL数据序列,确定组成所述视频的第i帧图像对应的VCL数据;将所述第i帧图像作为一个片层,并按照H.264视频压缩标准,将所述第i帧图像对应的VCL数据封装在第三NAL单元。
[0033] 其中,所述第三NAL单元的头信息用于标识所述片层,所述第三NAL单元的RBSP对应所述片层的片头及片层数据,i依次取1到M之间的整数。
[0034] 片头属于片层单元的一部分,片层编码包括片头和片层数据。需要注意的是,由于片头之后还需要接上片层数据,因此在片头句法元素的编码结束之后不进行添加尾比特操作,而是继续片层数据句法元素的编码。片层单元为VCL NAL单元,片层数据的编码数据即VCL数据,在本发明中它是一直的外部输入,由FPGA压缩编码得到。
[0035] 步骤4,在编码得到所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据之后,即为所述第一NAL单元、所述第二NAL单元和所述第三NAL单元添加起始码,并以码流形式输出所述第一NAL单元、所述第二NAL单元以及所述第三NAL单元的头信息和RBSP中片头的编码数据,并记录所述片头的编码数据最后不足8位的剩余编码数据,记剩余编码数据的位数为N。
[0036] 即,将序列参数集、图像参数集和片头以码流形式输出,由于片头之后需要与VCL数据相接,所以在此处保留片头编码最后不足8比特的剩余比特。
[0037] 需要说明的是,在网络传输的环境下,编码器将每个NAL各自独立、完整地放入一个分组,由于分组都有头部,解码器可以很方便地检测出NAL的分界,依次取出NAL进行解码。为了节省码流,H.264没有另外在NAL的头部设立表示起始的句法元素。但是如果编码数据是储存在介质上,由于NAL是依次紧密排列,解码器将无法在数据流中分辨每个NAL的起始和终止,所以必须要有另外的方式来解决这个问题。H.264压缩标准提供的方案是在每个NAL前添加起始码:0x000001。按照这样的方法,解码器在码流中检测起始码,作为一个NAL的起始标识,当检测到下一个起始码时当前NAL结束。
[0038] 值得说明的是,若此码流封装操作在计算机上通过软件程序进行,则不需要考虑实时性以及存储空间的限制。在操作时可以将VCL数据依次读入,对比特数重新组合后存入数组中,直到最后一个句法元素编码完成。接着添加尾比特,所有完成后直接将封装后的片层单元一同输出。而由于本发明是针对硬件上的码流封装实现,必须要满足实时性并且要考虑到存储空间的问题。实时性要求系统需要有不间断的码流输出,存储空间有限则不能将全部码流存储起来等到最后再输出。因此,先将序列参数集、图像参数集和片头先输出,之后的码流为生成一个输出一个。
[0039] 步骤5,在编码得到第三NAL单元的RBSP中片层数据的编码数据之后,将所述片头对应的编码数据的剩余编码数据与所述第i帧图像对应的第一个VCL数据的前8‑N位编码数据组合为8比特数,并输出,同时记录所述第i帧图像对应的第一个VCL数据剩余的N位编码数据;将所述第i帧图像对应的第一个VCL数据剩余的N位编码数据与所述第i帧图像对应的第二个VCL数据的前8‑N位编码数据组合为8比特数,并输出……如此直至所述第i帧图像对应的最后一个VCL数据剩余N位编码数据,对所述最后一个VCL数据的剩余N位编码数据添加尾比特后输出。
[0040] 即,如图3所示,读入一个VCL数据,若片头最后剩余比特的位数为N(N<8),则将第一个VCL数据的前8位与剩余比特数组合为一个8比特数,将其输出,并且保留该VCL数据剩余的N比特。然后读入下一个VCL数据,以此类推,直到当前这一帧码流结束,则对最后的N比特数据添加尾比特输出。
[0041] 图2所示即为一帧码流封装的NAL单元序列示意图,图中“NAL Header”即表示NAL单元的头信息。可以看出,一帧图像的VCL数据编码后对应三个NAL单元,其中序列参数集对应第一个NAL单元,图像参数集对应第二个NAL单元,片层对应第三个NAL单元。
[0042] 至此,对一帧的封装操作即结束,然后按照上述步骤开始新一帧的码流封装操作,直至i=M,即完成了对所述视频的封装操作。
[0043] 基于本发明上述方案,通过约定输入的VCL数据的格式,即约定每个VCL数据的高8位表示该VCL数据所属图像的帧号,低8位表示该VCL数据所属图像的编码码流,能够判断确定一帧码流的起始位置,从而将每一帧图像的VCL层码流封装为3个NAL单元,从而使解码器能够得到可直接解码的码流;同时,本发明方案在编码的同时即按照码流方式对编码数据依次输出,因此在满足实时性要求的同时,能够化解硬件系统存储空间有限的问题,可用于硬件实现方案。
[0044] 由于H.264规定当检测到0x000000时也可以表征当前NAL的结束,这是因为连着的三个字节的0中的任何一个字节的0要么属于起始码要么是起始码前面添加的0。因此,如果在NAL内部出现了0x000001或是0x000000的序列,解码器将把这些本来不是起始码的字节序列当作起始码,而错误地认为这里往后是一个新的NAL的开始,进而造成解码数据的错位。
[0045] 针对于此,本发明为了避免出现这样的情况,进行了“防止竞争”操作,具体来说即是:
[0046] 在输出第一NAL单元的RBSP、第二NAL单元的RBSP或第三NAL单元的RBSP之前,还包括:
[0047] 检测第一NAL单元的RBSP、第二NAL单元的RBSP或第三NAL单元的RBSP中是否包含字节序列0x000000、0x000001、0x000002或者0x000003,并在检测到包含字节序列0x000000、0x000001、0x000002或者0x000003时,替换为对应的新字节序列0x00000300、
0x00000301、0x00000302以及0x000003。
[0048] 即,在编码器编码完一个NAL时,检测RBSP中是否出现0x000000、0x000001、0x000002、0x000003四个字节序列,以防止它们和起始码竞争。如果检测到这些序列存在,需要在最后一个字节前插入一个新的字节:0x03,从而使它们变成0x00000300、
0x00000301、0x00000302、0x00000303的样子。当解码器在NAL内部检测到有0x000003的序列时,将把0x03抛弃,即可恢复原始数据。
[0049] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0050] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。