技术领域
[0001] 本发明涉及视频通信技术领域,更确切地说,它涉及一种高效的H264视频流实时加密方法。
相关背景技术
[0002] 随着科技的不断发展,和视频相关的网络应用越来越多,如视频点播、互联网电视、视频电话和视频会议等。相应的,网络上视频内容的安全也受到了越来越多的关注,例如视频点播服务,希望只有订购了服务的用户才能观看高质量节目;在商业视频会议应用中,会议参与者希望仅允许合法的与会成员能接收音频和视频数据,以保护会议内容的机密性。如何保护视频信息安全是一项十分紧迫和重要的工作,具有重要的理论意义和实际应用价值。
[0003] 视频加密,是利用密码学的方法来保护视频信息安全的技术,主要是研究适合视频数据特点的加密算法或加密方法。通过加密算法加密后的视频数据,只有拥有解密密钥的授权方才能解密并访问对应视频内容。人们对视频的加密已经提出了很多方法。根据在视频编码的不同阶段进行加密,可以分为三种:编码前加密、编码中加密和编码后加密。视频编码前加密,是对YUV图像数据进行加密,一般采用传统的文本加密算法(如DES、AES、RSA和IDEA等)先加密YUV数据,然后再对加密后的数据进行正常编码。该加密方法的运算量太大,很少采用。编码中加密,是指在编码的过程中同时加密,当编码结束后,生成的码流就是加密后的码流。编码中加密,一般采用选择性加密算法(Selective Encryption,SE),该方法考虑到视频码流数据的自身特性,只选择视频码流数据中少量关键语法元素或结构进行加密。如果在视频会议中对视频进行加密,因为要实时编码传输,就只能采用编码中加密。编码后加密,是指对已经编码好的、可以正常播放的视频文件,进行加密。有人采用传统的文本加密算法来加密,将视频文件视为一个普通文本文件,直接用传统文本加密算法进行加密,它需要的计算量很大,占用硬件资源多,加密后的文件大小改变,而且格式无法兼容。
也有人对编码后的视频文件进行分析,根据不同语法元素来加密。
[0004] 视频码流数据的语法格式是视频编码标准规定的,不同的视频编码标准就有不同的语法格式,因此选择性加密方法是要针对某一个具体的视频编码标准。当前主流的视频格式是H.264/AVC,近些年,研究者们针对H.264/AVC的视频数据加密,做了很多的研究,提出了许多方法,但依然存在以下问题:(1)加密算法复杂,计算量大,移动设备硬件资源不够处理(2)加密算法复杂导致编码时间长,视频通信无法实时,(3)加密后码流格式不兼容,导致标准解码器crash(4)加密后的码流数据比没加密的大很多,导致压缩率降低。
具体实施方式
[0042] 下面结合实施例对本发明做进一步描述。下述实施例的说明只是用于帮助理解本发明。应当指出,对于本技术领域的普通人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
[0043] 实施例1:
[0044] H.264协议规定标准的主要语法结构的流程顺序如下所示:
[0045] sps()→pps()→slice_header()→slice_data()
[0046] slice_data()包含该条带(slice)所有宏块的marcoblock_layer()数据,marcoblock_layer()包含语法数据顺序为:mb_type(intra16x16预测模式)()‑‑→mb_pre(含intra4x4预测模式,mvd值)→code_block_patter→mb_qp_delta‑→residual()[0047] residual()包含:residual_block_cavlc()
[0048] residual_block_cavlc()包含:Trailing_ones_sign_flag、Level_prefix、Level_suffix、TotalZeros和RunBefore
[0049] 本发明加扰或加密涉及到的语法有:
[0050] pps中的pic_inti_qp_minus26、chroma_qp_index_offse;slice_header中的slice_qp_delta;marcoblock_layer()的mb_type(intra16x16预测模式)、mb_pre(含intra4x4预测模式,mvd值)和residual();residual的residual_block_cavlc()中的Level_suffix值
[0051] 部分语法解释如下(更具体解释见H.264协议):
[0052] SPS:seq_parameter_set,序列参数集
[0053] PPS:pic_parameter_set,图像参数集
[0054] slice_header:条带头信息
[0055] slcide_data:条带内容具体信息
[0056] marcoblock_layer():宏块层数据
[0057] mb_type:宏块类型
[0058] mb_pre:宏块预测信息
[0059] code_block_patter:编码块模式
[0060] mb_qp_delta:宏块量化参数差值
[0061] residual():残差数据变长编码数据
[0062] residual_block_cavlc():采用cavlc方法进行变长编码后的数据
[0063] Trailing_ones_sign_flag:拖尾系数的符号值
[0064] Level_prefix:非零且非拖尾系数值进行CAVLC编码时的前缀部分
[0065] Level_suffix:非零且非拖尾系数值进行CAVLC编码时的后缀部分
[0066] TotalZeros:编码最后一个非零系数前0的总个数
[0067] RunBefore:每个非零系数前零的个数
[0068] 在此基础上,本申请实施例提供一种基于H264的选择性视频加密方法,选择加密少量的关键数据,既满足视频安全传输,也不增加计算量满足实时性要求,能在视频会议中的各个终端使用,特别是手机等硬件配置低的移动设备上,可以达到实时高效,压缩比基本不变。
[0069] 本申请对H264的部分关键语法数据进行加扰或加扰同时也加密,属于编码中加密。整个加扰加密过程是融入在编码过程中,不需要额外的单独进行。该实时高效的选择性视频加密方法,具体包括以下步骤:
[0070] 步骤1、采用加密算法RC4生成加密密钥流。
[0071] 步骤1采用经典的加密算法RC4来生成加密密钥流。RC4是一种对称加密算法,以字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。RC4的特点是算法简单,而且密钥长度是可变的,可变范围为1‑256字节,运行速度快,且不增加数据长度大小,特别适用于实时视频应用场景。由于视频码流数据量大,全部加密不仅耗时,生产的加密码流无法语法兼容,其他解码器不能正常播放。为了能语法兼容,本发明只对视频码流中加密后仍能正常播放的语法数据进行加密。利用RC4算法和密钥生成256字节长度的密钥流,后面加密过程中一直循环使用这256字节的密钥流。
[0072] 生成随机密钥流的具体方法包括:
[0073] 步骤1.1、用自然数0‑255初始化数组S‑box,通过输入的密钥将S‑box随机搅乱,确保S‑box的每个元素都得到处理;
[0074] 步骤1.2、根据输入密钥再次搅乱S‑box,生成密钥流的数组keyStream。
[0075] 在下文视频编码加密过程中,视频的语法元素和编码后的数据都称为明文,数组keyStream中数据称为密钥流(用完一个比特,自动移到下一个比特,到最后一个比特后再循环回到开始第一个比特),加密后的数据称为密文。基本的加密方法是明文和密钥流进行异或运算,得到密文。
[0076] 步骤2、对H264码流中和量化参数相关的参数进行加扰加密。
[0077] 步骤2包括:
[0078] 步骤2.1、采集图像,进入H.264编码阶段;
[0079] 步骤2.2、对图像参数集中的图像初始化亮度量化参数进行加扰加密;
[0080] 步骤2.3、对色度量化参数相对于亮度参数的偏移值进行加扰加密;
[0081] 步骤2.4、对条带层语法元素条带量化差值和宏块层量化参数进行加扰加密。
[0082] 图像初始化亮度量化参数、条带层语法元素条带量化差值、宏块层量化参数一起共同决定当前宏块的量化参数QP,而量化是图像质量损失的原因,量化参数的大小决定图像质量的好坏。对量化参数的加密能有效的影响图像质量。这几个量化相关参数都是有正值有负值的,本发明对它们采用相同的方法,先对正负号符号值加扰,加扰方法为:根据密钥流当前比特值做不同处理,如果比特值是0,就采用原来符号,若比特值是1,就采用与原来相反的符号。对加扰后的参数进行正常哥伦布码表编码会得到N位二进制,这N位比特中的第一个“1”是解码时计算前零个数的标志信息。为保证码流兼容,这个“1”和其前面零都不变,仅对第一个“1”后的N/2位比特进行加密。加密方法时:这N/2位比特和密钥流中的当前的N/2位比特进行异或加密。
[0083] 步骤3、对于帧内编码宏块,对其帧内预测模式进行加扰或加扰加密。
[0084] 步骤3中,帧内预测,需要周围的的数据作为预测值,而第一行缺少上面的预测数据,而第一列缺少左边的预测数据,如果对所有宏块的帧内预测模式值加密,可能导致普通解码器解码出错,出现码流不兼容问题。本发明只对不是第一行或第一列宏块的帧内预测模式值进行加扰加密处理。
[0085] 对于16x6的帧内预测模式,Intra16x16的帧内预测模式有四种,分别时:0表示垂直方向,1表示水平,2表示DC预测,3表示plane。先对编码模式值加扰,加扰方法为:和3互补,比如编码模式为1的加扰成2,2加扰成1,0加扰成3。因为Intra16x16的预测模式不是单独进行变长编码,而是和亮度、色度的编码模式一起作为宏块类型(mb_type)进行变长编码,为保证码流兼容,就不对mb_type的二进制比特流进行加密了。
[0086] 对于4x4的帧内预测模式,Intra4x4帧内预测模式有9种,模式值从0到8。在实际编码时,当实际使用的预测值(intra_mode)和最初预判的预测值(intra_pre)相同时,则该预测模式不编码;如果intra_mode大于intra_pre时,实际编码值为intra_mode减去1,否则编码值为intra_mode。先对编码模式值intra_mode加扰,加扰方法为:和8互补,编码模式为0加扰成8,1的加扰成7,2加扰成6,3加扰成5,4加扰成4,5加扰成3,类推其他值。这样加扰可能会让intra_mode的值变成预测值pre_mode,导致码流不兼容,正常解码出错。这里对加扰后和预测值pre_mode相同的那种预测模式,不做加扰处理,直接进入加密流程。对加扰后的Intra4x4帧内预测模式进行正常哥伦布码表编码会得到N位二进制,这N位比特中的第一个“1”是解码时计算前零个数的标志信息。为保证码流兼容,这个“1”和其前面零都不变,仅对第一个“1”后的N/2位比特进行加密。加密方法与步骤2相同,此处不再赘叙。
[0087] 步骤4、对于帧间编码宏块,对其运动矢量和预测运动矢量的差值进行加扰加密。
[0088] 运动矢量是指当前块在参考帧中对应最匹配的块的距离。运动矢量大小对图像的解码非常重要,运动矢量错误,会严重影响图像质量,而且容易做到加密后码流兼容。每个帧间编码块的运动矢量有X方向和Y方向两个,表示编码块和预测块在X方向和Y方向的距离,编码时候只编码运动矢量和预测运动矢量的差值(MVD),即X方向的MVDx和Y方向的MVDy。为了让运动估计得更准确,以减少编码数据,H.264的帧间宏块编码,可以划分多种大小的块进行运动估计,每个块都有自己对应得MVDx和MVDy。本发明对MVDx和MVDy加扰方法为:先把MVDx值和MVDy值互相交换,再对各自的符号位根据密钥流来加扰,如果对应密钥流比特值是0,就采用原来符号,若比特是1,就采用与原来相反的符号,这样基本不会影响编码后的数据长度,也就是码流大小。之后,再进行加密,加密方法与步骤2相同,此处不再赘叙。
[0089] 步骤5、对H264码流中的残差系数进行加扰加密。
[0090] H264协议中进入编码的数据是图像中的原始数据块和预测数据块的差值,该差值进行DCT变化再量化后变成残差系数。残差系数经过CAVLC(Context‑based Adaptive Variable Length Coding)编码变成H264码流部分输出。H264的码流大部分是残差系数,对残差系数的加密可以更有效的破坏图像视觉质量。残差系数编码步骤如下:(1)确定编码块中非零系数的数目(TotalCoeffs)和尾部系数绝对值为1的数目(TrailingOnes,也称拖尾系数个数,最多三个)以及最后一个非零系数前零的个数(Total_zeros)。(2)判断计算NC值:色度的直流系数NC=‑1;其他系数类型NC值是根据当前块左边4*4块的非零系数数目(NA)与当前块上面4*4块的非零系数数目(NB)求得。(3)编码所有的拖尾系数的符号位(Trailing_ones_sign_flag)。(4)编码非拖尾系数的非零系数的前缀部分Level_prefix与其后缀部分(Level_suffix)。(5)编码最后一个非零系数前0的个数(TotalZeros)。(6)编码每个非零系数前零的个数(RunBefore)。
[0091] 为了确保加密后的码流兼容,只对残差系数的中非零系数的符号位和幅度值进行加密,也就是上面步骤中的第(3)和第(4)步。非零系数中的拖尾系数,其幅值都是1,H.264对拖尾系数的幅值不编码,只对其符号位进行了编码,也就是步骤(3)的Trailing_ones_sign_flag。每个拖尾系数都有一个比特的Trailing_ones_sign_flag,和密钥流的当前比特值异或加密。非拖尾的非零系数Level,先按公式转换成一个非负数levelCode,再对leveCode进行变长编码。本专利先对该非零系数Level的符号位加扰,具体为:根据密钥流当前比特值做不同处理,如果比特值是0,就采用原来符号,若比特值是1,就采用与原来相反的符号。接着对加扰后的Level值按常规转换成levelCode,再根据levelCode计算出的level_prefix值和leve_suffix值编码。level_prefix值的编码对应的是固定码表,如果加密会出现码流不兼容,这里不对level_prefix进行加密;只对编码后的level_suffix部分和密钥对应比特数进行异或加密。
[0092] 实施例2:
[0093] 在实施例1的基础上,本申请实施例2提供了更具体的基于H264的选择性视频加密方法。
[0094] H.264协议规定的编码框架如图1所示。
[0095] 其中,I帧的编码流程:当前图像帧Fn,首先进行帧内预测模式选择,选定最佳帧内预测模式,进行帧内预测得到预测块(P),当前块按像素值减去预测块P对应位置像素值,得到差值Dn,经过DCT变换,接着量化得到残差系数X。X有两个去处,一个是进入Zig‑zag扫描重排,进入熵编码环节,最后变成NAL单元数据,也就是H.264的码流。X的另一个去处是进入反量化和逆DCT变换,得到解码后的残差系数Dn’,和前面的预测块P相加,得到图像uFn’,经过环路滤波(Filter)得到重建图像帧Fn’。后面P帧预测时,是以重建图像Fn’为参考图像的。实际编码过程是以宏块为单位的,上述过程的处理单位也是宏块,但预测块的大小可以是16x16的块,也可以是4x4的块。
[0096] P帧的编码流程:当前图像帧Fn,既要做帧内预测也要做帧间预测,然后选择一个最佳的预测。Fn先进入运动估计模块,得到最佳帧间预测模式和运动矢量,接着进入运动补偿模块。Fn进入帧内预测模块(同上面的I帧流程),得到最佳帧内预测模式。然后在帧内、帧间中选择最佳预测模式,生成预测块P。后面流程和I帧编码相同,进入DCT变换、量化、Zig‑zag扫描重排和熵编码,生成H.264码流。
[0097] 为了不影响H.264的后续编码过程,本发明的处理过程在图1的熵编码过程中进行,只对码流有影响,对重建图像没有任何影响,可以确保解密后图像质量不变。
[0098] 具体的,本申请实施例以视频会议应用场景为例,说明本发明的实施过程。
[0099] 首先采用RC4算法和加密密钥生成256字节的密钥流,后面加密过程一直循环这256个字节的密钥流。
[0100] 接着采集图像,进入H.264编码阶段。在编码过程中,最先碰到的图像参数集中的图像初始化亮度量化参数、色度量化参数相对于亮度参数的偏移值,对它们的正负符号根据密钥流进行加扰,如果对应密钥流比特为0,采用原来符号,如果对应密钥流比特为1,采用与原来符号相反的符号。按照H.264标准协议对加扰后的图像初始化亮度量化参数和色度量化参数相对于亮度参数的偏移进行变长编码,生成N位二进制比特流,对该比特流的后面N/2位比特和对应密钥流N/2比特进行异或加密。
[0101] 按编码顺序,接着是对H264码流中的条带层语法元素条带量化差值进行加扰加密。条带层的量化参数计算方法,第一帧QPslcie=26+pic_inti_qp_minus26+slice_qp_delta,后面每一帧条带层量化参数为上一个条带参数加条带量化差值的和即QPslcie=QPslice‑pre+slice_qp_delta。
[0102] 条带量化差值有正有负,先对其符号位加扰,加扰方法为:根据密钥流当前比特值做不同处理,如果比特值是0,就采用原来符号,若比特值是1,就采用与原来相反的符号。对加扰后的条带量化差值进行正常编码得到N位二进制,对该比特流的后面N/2位比特和对应密钥流N/2比特进行异或加密。
[0103] 按照编码顺序,接着是第一帧编码。由于第一帧是帧内编码帧,其所有宏块都是帧内编码。对于第一行或第一列以外的宏块,对预测模式进行加扰或加扰加密。如果是16x6的帧内预测模式,对预测模式仅加扰不做加密;先把预测模式和3进行互补运算,再和色度、亮度编码模式一起作为mb_type进行正常的变长编码。如果是4x4的帧内预测模式,则先把预测模式和8进行互补运算,再进行正常的变长编码,生成N位二进制比特流,对该比特流的后面N/2位比特和对应密钥流N/2比特进行异或加密。
[0104] 按照编码顺序,接着是对宏块层量化参数mb_qp_delta进行加扰加密。当前宏块的量化参数QPcur是前一个宏块的量化参数QPpre和的和(QPcur=QPpre+mb_qp_delta)。mb_qp_delta值的范围是(‑26,25),先对其符号位加扰,加扰方法为:如果密钥流当前比特值是0,就采用原来符号,若比特值是1,就采用与原来相反的符号。对加扰后的mb_qp_delta进行正常变长编码得到N位二进制,为保证码流兼容,对该比特流的后面N/2位比特和对应密钥流N/2比特进行异或加密。
[0105] 接着对宏块残差系数进行变长编码,对应加密过程为:对残差系数的中非零系数的符号位和幅度值进行加密。非零系数中的拖尾系数,由于H.264协议对幅值不编码,只对其符号位Trailing_ones_sign_flag进行了编码;故对每个拖尾系数都有一个比特的Trailing_ones_sign_flag,和密钥流的当前比特值异或加密。其他非零系数Level,是有正有负的,正常编码过程是先转换成一个非负数levelCode,再编码。本专利先对该非零系数Level的符号位加扰,具体为:根据密钥流当前比特值做不同处理,如果比特值是0,就采用原来符号,若比特值是1,就采用与原来相反的符号。接着进行常规转换成levelCode,再根据levelCode计算出的level_prefix值和leve_suffix值编码。level_prefix值的编码对应的是固定码表,如果加密会出现解码不兼容,这里不对level_prefix进行加密;只对编码后的level_suffix部分加密,加密方法是和密钥流对应比特数进行异或加密。
[0106] 接着循环对每一个宏块进行编码且加扰加密,到第一帧最后一个宏块结束,进入下一帧编码。同样先是对H264码流中的条带层语法元素条带量化差值进行加扰加密编码结束,方法同前面。由于第二帧是帧间预测编码的P帧,可以有帧内预测宏块和帧间预测宏块。如果是帧内预测宏块,其加扰加密方法如前帧内预测宏块相同。如果是帧间预测编码宏块,则对其MVDx和MVDy加扰加密:先把MVDx值和MVDy值互相交换,然后对于正负符号位加扰,如果对应密钥流比特值是0,就采用原来符号,若比特是1,就采用与原来相反的符号。对加扰后的MVDx和MVDy进行正常变长编码得到N位二进制,对后面的N/2位比特和密钥流中的当前的N/2位比特进行异或加密。
[0107] 接着是对宏块层量化参数mb_qp_delta进行加扰、编码和加密,方法同第一帧的宏块。
[0108] 接着是对宏块中各个块的残差系数进行加扰、编码和加密,方法同第一帧的宏块。
[0109] 循环处理完第二帧所有宏块,进入第三帧编码过程。第三帧加扰、编码和加密过程和第二帧完全相同,依此类推到后面每一帧。如果是P帧,方法同第二帧;如果是I帧,方法同第一帧。
[0110] 对H.264编码的经典序列paris.cif、tempete.cif、foreman.qcif各100帧,CIF序列的目标码率是384Kbits/s,Qcif序列的目标码率是128Kbits/s。加密前后的数据比较如下表1。从表中可见,加密后,表示图像质量的PSNR值大大降低;但码率和编码时间基本不变。加密后的码流完全兼容其他标准H.264解码器,用开源的FFMPEG解码器可以正常解码,不会出现crash的情况。
[0111] 表1加密前后PSNR、码率和编码时间的比较
[0112]
[0113] 加密前后的图像质量如图2‑图7所示,从图中可见,加密后的图像人眼完全无法识别,有效的保护了图像信息。
[0114] 需要说明的,本实施例中与实施例1相同或相似的部分可相互参考,在本申请中不再赘述。
[0115] 实施例3:
[0116] 在实施例1、2的基础上,本申请实施例3提供了一种H264视频流实时视频加密系统,包括:
[0117] 生成模块,用于采用加密算法RC4生成加密密钥流;
[0118] 第一加扰加密模块,用于对H264码流中和量化参数相关的参数进行加扰加密;
[0119] 第二加扰加密模块,用于对于帧内编码宏块,对其帧内预测模式进行加扰或加扰加密;
[0120] 第三加扰加密模块,用于对于帧间编码宏块,对其运动矢量和预测运动矢量的差值进行加扰加密;
[0121] 第四加扰加密模块,用于对H264码流中的残差系数进行加扰加密。
[0122] 具体的,本实施例所提供的系统为实施例1、2提供的方法对应的系统,因此,在本实施例中与实施例1、2相同或相似的部分,可相互参考,在本申请中不再赘述。