视频编码方法和视频编码器与流程

文档序号:12498248阅读:599来源:国知局
视频编码方法和视频编码器与流程
本发明实施例涉及视频编码技术,尤其涉及一种视频编码方法和视频编码器。
背景技术
:视频编码是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件,用于减少视频容量的大小,提高传输效率。其中,视频编码具体包括预测编码、残差编码、变换、量化、熵编码等多个步骤。目前,为了提高视频编码的效率,常用的视频编码有帧间并行视频编码和帧内并行视频编码,其中,帧内并行视频编码具体为片级并行编码,该视频编码的方式是将一帧图像在横向上划分成多个片,多个片之间并行进行编码。但是,由于上述多个片之间在进行并行编码的过程中,易导致无法为每个片内的宏块找到最佳预测像素值,使得宏块的码率偏高,进而导致视频编码后的图像的码率偏高。技术实现要素:本发明提供一种视频编码方法和视频编码器,以解决现有技术中视频编码后的图像的码率偏高的技术问题。本发明第一方面提供一种视频编码方法,包括:确定待编码视频图像数据的待编码阵列,其中,所述待编码阵列包括m×n个宏块,m和n均为大于1的整数;对所述待编码阵列中的宏块进行分组,其中,在分组过程中,将前一个宏块组的宏块作为参考帧,确定所述前一个宏块组的参考帧对应的预测帧,将所述前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块;启动N个进程并行对所述待编码阵列中的宏块进行编码,其中,所述N 个进程每一轮并行对一个宏块组进行编码,每一轮编码过程中每个进程对所述宏块组中的至少一个宏块进行编码。如上所述,所述对所述待编码阵列中的宏块进行分组,具体包括:将所述待编码阵列中的第一列宏块作为参考帧,并将所述第一列宏块的编号设置为从小到大的连续奇数或连续偶数;将所述第一列宏块的编号加1作为相邻的后一宏块的编号,其中,所述相邻的后一宏块为所述第一列宏块对应的预测帧;对所述待编码阵列中的其他宏块进行编号,其中,所述其他宏块的编号为相邻的前一宏块的编号加1,所述相邻的前一宏块为所述其他宏块对应的参考帧;将所述待编码阵列中编号相同的宏块划分到一个宏块组中;则所述启动N个进程并行对所述待编码阵列中的宏块进行编码,具体包括:所述N个进程每一轮并行对一个宏块组进行编码,各轮之间按照所述待编码阵列中所述宏块组中的宏块对应的编号由小到大执行。如上所述,所述启动N个进程并行对所述待编码阵列中的宏块进行编码,包括:针对第i个宏块,当所述第i个宏块的预测编码的类型为帧内预测编码时,则确定所述第i个宏块的帧内预测编码模式;根据确定的所述第i个宏块的帧内预测编码模式,从已经编码的宏块中确定所述第i个宏块的预测像素值;所述第i个宏块为所述待编码阵列中的宏块中的任意一个宏块;确定所述第i个宏块和所述预测像素值的残差;对所述第i个宏块和所述预测像素值的残差进行变换;确定所述第i个宏块的量化步长,根据所述第i个宏块的量化步长对变换后的数据进行量化;对量化后的数据进行熵编码得到所述第i个宏块的编码数据。如上所述,所述待编码阵列中每行宏块的最后一个宏块的量化步长为预先设定的常数,所述方法还包括:在对所述第i个宏块进行熵编码完成后,根据所述第i个宏块与相邻的前一宏块的量化步长,确定所述第i个宏块与相邻的前一宏块的量化步长的差 值;将所述第i个宏块与相邻的前一宏块的量化步长的差值写入所述第i个宏块的编码数据中;将所述第i个宏块的编码数据写入所述码流缓冲区中。如上所述,所述方法还包括:在所述待编码阵列的所有宏块都进行熵编码完成后,确定每个宏块与相邻的前一宏块的量化步长的差值;将每个宏块与相邻的前一宏块的量化步长的差值分别写入每个宏块的编码数据中;将所述待编码阵列的所有宏块的编码数据写入所述码流缓存区中。本发明第二方面提供一种视频编码器,包括:确定模块,用于确定待编码视频图像数据的待编码阵列,其中,所述待编码阵列包括m×n个宏块,m和n均为大于1的正整数;分组模块,用于对所述待编码阵列中的宏块进行分组,其中,在分组过程中,将前一个宏块组的宏块作为参考帧,确定所述前一个宏块组的参考帧对应的预测帧,将所述前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块;编码模块,用于启动N个进程并行对所述待编码阵列中的宏块进行编码,其中,所述N个进程每一轮并行对一个宏块组进行编码,每一轮编码过程中每个进程对所述宏块组中的至少一个宏块进行编码。如上所述,所述分组模块,用于对所述待编码阵列中的宏块进行分组,具体为:所述分组模块,具体用于将所述待编码阵列中的第一列宏块作为参考帧,并将所述第一列宏块的编号设置为从小到大的连续奇数或连续偶数;将所述第一列宏块的编号加1作为相邻的后一宏块的编号,其中,所述相邻的后一宏块为所述第一列宏块对应的预测帧;对所述待编码阵列中的其他宏块进行编号,其中,所述其他宏块的编号为相邻的前一宏块的编号加1,所述相邻的前一宏块为所述其他宏块对应的参考帧;将所述待编码阵列中编号相同的宏块划分到一个宏块组中;则所述编码模块,用于启动N个进程并行对所述待编码阵列中的宏块进 行编码,具体为:所述编码模块,具体用于启动N个进程并行对所述待编码阵列中的宏块进行编码,所述N个进程每一轮并行对一个宏块组进行编码,各轮之间按照所述待编码阵列中所述宏块组中的宏块对应的编号由小到大执行。如上所述,所述编码模块,具体包括:确定单元,用于针对第i个宏块,当所述第i个宏块的预测编码的类型为帧内预测编码时,则确定所述第i个宏块的帧内预测编码模式,根据确定的所述第i个宏块的帧内预测编码模式,从已经编码的宏块中确定所述第i个宏块的预测像素值,并确定所述第i个宏块和所述预测像素值的残差;其中,所述第i个宏块为所述待编码阵列中的宏块中的任意一个宏块;变换单元,用于对所述第i个宏块和所述预测像素值的残差进行变换;确定单元,还用于确定所述第i个宏块的量化步长;量化单元,用于根据所述第i个宏块的量化步长对变换后的数据进行量化;熵编码单元,用于对量化后的数据进行熵编码得到所述第i个宏块的编码数据。如上所述,所述待编码阵列中每行宏块的最后一个宏块的量化步长为预先设定的常数,所述视频编码器还包括:第一确定模块,用于在对所述第i个宏块进行熵编码完成后,根据所述第i个宏块与相邻的前一宏块的量化步长,确定所述第i个宏块与相邻的前一宏块的量化步长的差值;第一写入模块,用于将所述第i个宏块与相邻的前一宏块的量化步长的差值写入所述第i个宏块的编码数据中;并将所述第i个宏块的编码数据写入所述码流缓冲区中。如上所述,所述视频编码器还包括:第二确定模块,用于在所述待编码阵列的所有宏块都进行熵编码完成后,确定每个宏块与相邻的前一宏块的量化步长的差值;第二写入模块,用于将每个宏块与相邻的前一宏块的量化步长的差值分别写入每个宏块的编码数据中;并将所述待编码阵列的所有宏块的编码数据写入所述码流缓存区中。本发明所提供的视频编码方法和视频编码器,通过将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块的分组方式,且通过同一宏块组的宏块并行进行视频编码的方式,使得在对待编码阵列中每个宏块进行帧内预测编码时,该宏块左侧的宏块、左上方的宏块、正上方的宏块和右上方的宏块(即该宏块的参考帧)的视频编码均已完成,这样不仅可以使用宏块左侧的宏块的编码重建结果进行帧内预测编码,还可以使用该宏块左上方的宏块、正上方的宏块和右上方的宏块的编码重建结果进行帧内预测编码,在实现了帧内并行视频编码的基础上,大大提高了为宏块找到最佳预测像素值的概率,进而降低了宏块视频编码后的码率,提高了视频编码的速度,从而降低了视频编码后的视频图像数据的码率,提高了视频编码的速度。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明提供的视频编码方法实施例一的流程示意图;图2为本发明提供的视频编码方法实施例二的流程示意图;图3为本发明提供的视频编码方法实施例三的流程示意图;图4为本发明提供的视频编码方法实施例四的流程示意图;图5为本发明提供的视频编码方法实施例五的流程示意图;图6为本发明提供的视频编码器实施例一的结构示意图;图7为本发明提供的视频编码器实施例二的结构示意图;图8为本发明提供的视频编码器实施例三的结构示意图;图9为本发明提供的视频编码器实施例四的结构示意图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为了便于对本发明涉及的方法的理解,下面先对现有技术中的视频编码的具体过程进行简单的介绍。帧内视频编码是指以一帧图像中的每个宏块为基本单位,通过对每个宏块进行帧内预测编码、残差编码、变换、量化、熵编码等,将一帧图像进行压缩,以减少该图像的容量,提高视频传输效率。目前,帧内视频编码具体为片级并行编码,该帧内视频编码的方式是将一帧图像在横向上划分成多个片,每个片包括多个宏块,多个片之间并行进行编码。但是,由于上述多个片之间在进行并行编码的过程中,易导致无法为每个片内的宏块找到最佳预测像素值,使得宏块的码率偏高,进而导致视频编码后的图像的码率偏高。本发明涉及的方法可以用于帧内视频编码,旨在解决现有技术中视频编码后的图像的码率偏高的技术问题。下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。图1为本发明提供的视频编码方法实施例一的流程示意图。本实施例一的执行主体为视频编码器,本实施例一涉及的是视频编码器如何根据接收的待编码视频图像数据,对该待编码视频图像数据进行帧内并行视频编码的具体过程。如图1所示,该方法包括:S101:确定待编码视频图像数据的待编码阵列,其中,待编码阵列包括m×n个宏块,m和n均为大于1的整数。具体的,上述待编码视频图像数据可以为任意一帧发送给视频编码器的待编码的视频图像。在本实施例中,当上述视频编码器在接收到该待编码视频图像数据后,就可以根据现有视频编码规范中所规定的宏块的大小,以宏块为基本单位,确定该待编码视频图像数据的待编码阵列,其中,该待编码阵列包括m×n个宏块,其中,该m×n个宏块的数量具体可以根据该待编码视频图像数据的大小和宏块的大小确定,即根据该帧图像数据的长和宽、以及宏块的长和宽确定。S102:对待编码阵列中的宏块进行分组,其中,在分组过程中,将前一 个宏块组的宏块作为参考帧,确定前一个宏块组的参考帧对应的预测帧,将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块。具体的,根据现有的视频编码方法,为了降低视频编码后的视频图像数据的码率,在对待编码阵列中的每个宏块执行视频编码的帧内预测编码动作时,需要参考该宏块相邻的宏块的编码后的重建数据,以去除所编码的宏块中的冗余信息,进而达到降低宏块的码流的目的。其中,上述在为该宏块执行帧内预测编码时所需要参考的宏块即为该宏块的参考帧,该宏块的参考帧具有可以为该宏块相邻的左侧宏块、该宏块相邻的左上方的宏块、该宏块相邻的正上方的宏块、该宏块相邻的右上方的宏块,则对应的,该宏块即为该宏块参考帧的预测帧,即该宏块为该宏块相邻的左侧宏块、该宏块相邻的左上方的宏块、该宏块相邻的正上方的宏块、该宏块相邻的右上方的宏块的预测帧。在本实施例中,通过上述对待编码阵列中的宏块进行分组的方式,可以将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块,从而使得在对当前宏块组的宏块进行视频编码时,该当前宏块组的每个宏块的参考帧均已完成视频编码,从而使得在对当前宏块组的每个宏块进行视频编码时,可以使用该宏块的所有参考帧对其进行帧内预测编码,从而可以为该宏块找到最佳预测像素值,进而可以通过该最佳预测像素值去除该宏块的冗余信息,进而达到降低宏块的码流的目的。S103:启动N个进程并行对待编码阵列中的宏块进行编码,其中,N个进程每一轮并行对一个宏块组进行编码,每一轮编码过程中每个进程对宏块组中的至少一个宏块进行编码。具体的,上述进程为视频编码器中用于对宏块进行编码的进程,当上述视频编码器对待编码阵列中的宏块进行分组之后,就可以按照每个宏块组的宏块对应的预测帧,向后追溯至最后一组宏块,并按照这个顺序,每一轮启动N个进程对一个宏块组并行进行编码,从而可以确保进程在对每一个宏块组进行编码时,该宏块组的每个宏块对应的参考帧均已完成视频编码。以此类推,直至最后一轮完成最红一个宏块组的视频编码,至此就完成了该待编码阵列中的所有宏块的编码。需要说明的是,上述每一轮视频编码器所使用的N个进程的个数可以相 同,也可以不同,该N的大小具体可以根据每个宏块组的宏块的个数、以及视频编码器所支持的同时用于编码的进程的最大个数确定。若某一组宏块的个数大于视频编码器所支持的同时用于编码的进程的最大个数时,则视频编码器在对该宏块组中的宏块进行并行编码时,其中一个或多个进程可以用于对宏块组中的多个宏块进行视频编码。现有技术中,帧内并行视频编码为片级并行编码,该视频编码的方式是将一帧图像在横向上划分成多个片,多个片之间并行进行编码,即启动多个进程同时分别对每个片内的宏块执行帧内预测编码、残差编码、变换、量化、熵编码等多个步骤。然而,由于上述多个进程同时对每个片内的宏块进行编码,所以上述进程在对每个片内的宏块进行帧内预测编码时,无法跨越划分后的片为宏块进行帧内预测编码,也就是说,进程无法获知该宏块上方片内的宏块的编码重建结果,所以进程无法使用该宏块上方片内的宏块的编码重建结果进行帧内预测编码,也就是说,只能将该宏块相邻的左侧宏块作为该宏块的参考帧,不能将该宏块相邻的正上方的宏块、该宏块相邻的右上方的宏块作为该宏块的参考帧,使得进程只能使用该宏块左侧的宏块的编码重建结果进行帧内预测编码,从而使得进程可能无法为宏块找到最佳预测像素值,导致宏块在编码后的码率偏高,进而导致视频编码后的图像的码率偏高。而本实施例所提供的视频编码方法,通过将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块的分组方式,使得进程在对每个宏块进行帧内预测编码时,该宏块的所有参考帧均已完成视频编码,即该宏块相邻的左侧的宏块、左上方的宏块、正上方的宏块和右上方的宏块的视频编码均已完成,这样进程不仅可以使用宏块左侧的宏块的编码重建结果进行帧内预测编码,还可以使用该宏块左上方的宏块、正上方的宏块和右上方的宏块的编码重建结果进行帧内预测编码,使得在实现了帧内并行视频编码的基础上,大大提高了为宏块找到最佳预测像素值的概率,进而降低了宏块编码后的码率,提高了编码的速度,从而降低了视频编码后的图像的码率,提高了视频编码的速度。本发明所提供的视频编码方法,通过将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块的分组方式,且通过同一宏块组的宏块并行进行视频编码的方式,使得在对待编码阵列中每个宏块进行帧内预测编码时,该 宏块左侧的宏块、左上方的宏块、正上方的宏块和右上方的宏块(即该宏块的参考帧)的视频编码均已完成,这样不仅可以使用宏块左侧的宏块的编码重建结果进行帧内预测编码,还可以使用该宏块左上方的宏块、正上方的宏块和右上方的宏块的编码重建结果进行帧内预测编码,在实现了帧内并行视频编码的基础上,大大提高了为宏块找到最佳预测像素值的概率,进而降低了宏块视频编码后的码率,提高了视频编码的速度,从而降低了视频编码后的视频图像数据的码率,提高了视频编码的速度。图2为本发明提供的视频编码方法实施例二的流程示意图,本实施例二的执行主体为视频编码器,本实施例二涉及的是视频编码器如何对待编码阵列中的宏块进行分组的具体过程。如图2所示,该方法包括:S201:确定待编码视频图像数据的待编码阵列。其中,S201的具体执行过程可以参见上述S101的描述,在此不再赘述。S202:将待编码阵列中的第一列宏块作为参考帧,并将第一列宏块的编号设置为从小到大的连续奇数或连续偶数;将第一列宏块的编号加1作为相邻的后一宏块的编号,其中,相邻的后一宏块为第一列宏块对应的预测帧;对待编码阵列中的其他宏块进行编号,其中,其他宏块的编号为相邻的前一宏块的编号加1,相邻的前一宏块为所述其他宏块对应的参考帧;将待编码阵列中编号相同的宏块划分到一个宏块组中。具体的,以上述待编码阵列中第一列宏块的编号为连续的奇数为例,上述待编码阵列中第一列宏块的编号可以为从1到2m-1的连续奇数,也可以为从3到2m+1的连续奇数,还可以为其他任意连续的奇数段,本实施例对此不进行赘述。在本实施例中,上述待编码阵列中除第一列宏块之外的其他宏块的编号均为相邻的前一宏块的编号加1,其中,这里所说的每个宏块的相邻的前一宏块为即为该宏块相邻的左侧宏块,通过这种方式,可以使得待编码阵列中的每个宏块组中的宏块的编号相同,且使得每个宏块组中的宏块的参考帧所在的宏块组的编号均小于该宏块组中的宏块对应的编号,这样,在对该待编码阵列中的宏块进行分组时,可以仅根据每个宏块对应的编号,将相同编号的宏块划分到一个宏块组即可,降低了划分待编码阵列的分组的工作量,提高了分组效率。示例性的,以上述待编码阵列中第一列宏块的编号为从1到2m-1的连续奇数为例,则上述待编码阵列中的每个宏块的编号方式可以如表1所示:表11234567891011…345678910111213…56789101112131415…7891011121314151617…910111213141516171819…1112131415161718192021…………………………………可选的,在本实施例的另一种实现方式中,上述待编码阵列中第一列宏块的编号还可以为连续的偶数,具体实现时,上述待编码阵列中第一列宏块的编号可以为从0到2m-2的连续偶数,也可以为从2到2m的连续偶数,还可以为其他任意连续的偶数段,本实施例对此不进行赘述。S203:启动N个进程并行对待编码阵列中的宏块进行编码,其中,N个进程每一轮并行对一个宏块组进行编码,各轮之间按照待编码阵列中宏块组中的宏块对应的编号由小到大执行。具体的,当上述视频编码器将相同编号的宏块划分到同一个宏块组之后,就可以按照每一个宏块组的宏块所对应的编号的大小,以编号从小到大的顺序对各个宏块组进行排序,并按照该顺序,每一轮启动N个进程对每一个宏块组的宏块并行进行编码,即相同编号的宏块同时进行编码,也就是说,第一轮对所有编号为1的宏块进行编码,第二轮对所有编号为2的宏块进行编码,第三轮对所有编码为3的宏块进行编码,第四轮对所有编号为4的宏块进行编码,以此类推,直至最后一轮对所有最后一个编号(即待编码阵列中的宏块对应的最大编号)的宏块进行编码,至此就完成了该待编码阵列中的所有宏块的编码。本发明所提供的视频编码方法,通过上述对待编码阵列中各宏块进行编号的方式,可以使得同一个宏块组中的宏块对应的编号相同,进而使得在对该待编码阵列中的宏块进行分组时,可以仅根据每个宏块对应的编号,将相同编号的宏块划分到一个宏块组即可,在降低了视频编码后的视频图像数据 的码率的基础上,降低了划分待编码阵列的分组的工作量,提高了分组效率,从而提高了视频编码的速度。图3为本发明提供的视频编码方法实施例三的流程示意图。本实施例三的执行主体为视频编码器,本实施例三以待编码阵列中的宏块中的任意一个宏块,即第i个宏块为例,重点介绍视频编码器如何对待编码阵列中的第i个宏块进行编码的具体过程。为了便于对本实施例的理解,本实施例将以下述示例对本实施例的每个步骤进行详细解释和说明,在该示例中,视频编码器将待编码视频图像数据划分成由5×3个宏块组成的待编码阵列,其中,该待编码阵列中的每个宏块的编号具体如下述表2所示,视频编码器中存储的每一个宏块组的宏块具体可以如表3所示:表2123453456756789表3以上述表2中所示的第五组的其中一个宏块为第i个宏块为例,其中,第五组的宏块为第四组的宏块对应的预测帧,第四组的宏块为第五组的宏块的参考帧。具体实施本方法之前,需要先做如下准备,具体地,由于第五组包括的宏块的个数多于第四组包括的宏块的个数,因此,在主进程和第一子进程(即用于与主进程并行对第四组的宏块进行编码的进程)对第四组的宏块进行编码完成后,主进程可以唤醒第二子进程,以共同对第五组的宏块进行编码。其中,主进程唤醒第二子进程的具体实现方式可以参见现有技术。上述用于执行第五组的宏块的编码的进程数量与第五组的宏块的数量相同,即主进程、第一子进程和第二子进程可以分别执行一个宏块的编码。例如,可以采用主进程对第一排的第五个宏块(编号为5)进行编码,第一子进程对第二排的第三个宏块(编号为5)进行编码,第二子进程对第三排的第一个宏块(编号为5)进行编码的方式;或者,采用主进程对第三排的第一个宏块(编号为5)进行编码,第一子进程对第一排的第五个宏块(编号为5)进行编码,第二子进程对第二排的第三个宏块(编号为5)进行编码的方式等。具体实施时,视频编码器可以预先分别为主进程、第一子进程和第二子进程分配其所需要为哪组哪个宏块执行编码。本实施例中,以第i个宏块为上述表2中的第二排的第三个宏块(编号为5)为例,其中,第一子进程用于对第二排的第三个宏块(编号为5)进行编码,如图3所示,上述方法可以包括如下步骤:S301:确定第i个宏块的预测编码的类型是否为帧内预测编码,若是,则执行S302,若否,则结束流程。具体的,上述第一子进程在对第二排的第三个宏块(编号为5)进行编码时,首先需要先确定第二排的第三个宏块(编号为5)的预测编码的类型,即该第二排的第三个宏块(编号为5)的预测编码的类型为帧间预测编码还是为帧内预测编码。若为帧内预测编码,则执行S302,若为帧间预测编码,则结束流程。其中,上述确定第i个宏块的预测编码的类型是否为帧内预测编码,也可以使用现有技术中的确定方式,本实施对此不再赘述。S302:根据第i个宏块的预测编码的类型,确定第i个宏块的帧内预测编码模式。其中,上述如何根据第i个宏块的预测编码的类型,确定第i个宏块的帧内预测编码模式,可以参见现有技术,本实施对此不再赘述。S303:根据确定的第i个宏块的帧内预测编码模式,从已经编码的宏块中确定第i个宏块的预测像素值。具体的,继续参照上述表2和表3所示的示例,上述第一子进程可以根据上述确定的帧内预测编码模式,通过该宏块(第二排的第三个宏块,编号为5)左侧的宏块(第二排的第二个宏块,编号为4)、左上方的宏块(第一排第二个宏块,编码为2)、正上方的宏块(第一排的第三个宏块,编号为3)以及右上方的宏块(第一排的第四个宏块,编号为4),即该宏块(第二排的第三个宏块,编号为5)的参考帧对该宏块(第二排的第三个宏块,编号为5)进行帧内预测编码,以获取该宏块(第二排的第三个宏块,编号为5)的预测像素值,即与该宏块(第二排的第三个宏块,编号为5)的像素值最接近的像素值,其中,该预测像素值具体可以为一16乘16的像素值矩阵。与现有技术中的帧内预测方法相比,在该种情况下,由于无法跨越划分后的片内的宏块的编码重建结果为该宏块(第二排的第三个宏块,编号为5)进行帧内预测编码,即,不能使用该宏块(第二排的第三个宏块,编号为5)左上方的宏块(第一排第二个宏块,编码为2)、正上方的宏块(第一排的第三个宏块,编号为3)以及右上方的宏块(第一排的第四个宏块,编号为4)对该宏块(第二排的第三个宏块,编号为5)作为该宏块的参考帧进行帧内预测编码相比,本实施例提供的视频编码方法,大大提高了进程为宏块找到最佳预测像素值的概率,降低了宏块视频编码后的码率,提高了视频编码的速度,从而降低了视频编码后的视频图像数据的码率,提高了视频编码的速度。需要说明的是,上述根据确定的第i个宏块的帧内预测编码模式,从已经编码的宏块中确定第i个宏块的预测像素值,也可以使用现有技术中的确定宏块的预测像素值的方式,本实施例对此不再赘述。S304:确定第i个宏块和预测像素值的残差。具体的,该步骤具体用于去除所编码的宏块中的冗余信息,继续参照上述表2和表3所示的示例,当上述第一子进程为第二排的第三个宏块(编号为5)确定预测像素值之后,第一子进程就可以将该宏块(第二排的第三个 宏块,编号为5)与预测像素值中相同位置的像素值相减,将像素值中相同的部分去除,以获取该宏块(第二排的第三个宏块,编号为5)与预测像素值的残差,该残差的具体表现形式可以为一16乘16的矩阵阵列(简称为残差矩阵),其中,该残差矩阵中部分位置的像素值为0(即说明宏块与预测像素值在该位置的像素值相同)。需要说明的是,上述确定第i个宏块和预测像素值的残差,也可以使用现有技术中的确定宏块和预测像素值的残差的方式,本实施例对此不再赘述。S305:对第i个宏块和预测像素值的残差进行变换。具体的,该步骤具体用于进一步去除所编码的宏块中的冗余信息,继续参照上述表2和表3所示的示例,当上述第一子进程确定第二排的第三个宏块(编号为5)和预测像素值的残差矩阵之后,就可以对该残差矩阵进行变换,该变换具体可以为离散余弦变换,残差矩阵进行变换后为一16乘16的系数矩阵(简称系数矩阵),相比于残差矩阵,该系数矩阵中的像素值为0的个数进一步增多。其中,上述对第i个宏块和预测像素值的残差进行变换,也可以使用现有技术中的对宏块和预测像素值的残差进行变换的方式,本实施例对此不再赘述。S306:确定第i个宏块的量化步长,根据第i个宏块的量化步长对变换后的数据进行量化。具体的,该步骤具体用于进一步去除所编码的宏块中的冗余信息,即去除系数矩阵中的较小值,以及减少系数矩阵中的其他像素值的大小,达到减少编码的比特数,压缩码流的效果。继续参照上述表2和表3所示的示例,当上述第一子进程确定第二排的第三个宏块(编号为5)和预测像素值的残差进行变换之后,就可以根据变换矩阵中的各像素值确定该宏块(第二排的第三个宏块,编号为5)的量化步长,并根据确定的量化步长,对系数矩阵进行量化,即将系数矩阵中的每个像素值均除以该量化步长,得到量化后的矩阵(简称量化矩阵)。其中,上述确定第i个宏块的量化步长,以及根据第i个宏块的量化步长对变换后的数据进行量化,也可以使用现有技术中的确定第i个宏块的量化步长,以及根据第i个宏块的量化步长对变换后的数据进行量化的方式,本实施例对此不再赘述。S307:对量化后的数据进行熵编码得到第i个宏块的编码数据。具体的,该步骤具体用于进一步去除所编码的宏块中的冗余信息,达到减少编码的比特数,压缩码流的效果,其中,上述对量化后的数据进行熵编码得到第i个宏块的编码数据,具体可以参见现有技术。执行完S307之后,则结束,至此就完成了该第i个宏块的编码。本发明所提供的视频编码方法,通过将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块的分组方式,且通过同一宏块组的宏块并行进行视频编码的方式,使得在对待编码阵列中每个宏块进行帧内预测编码时,该宏块左侧的宏块、左上方的宏块、正上方的宏块和右上方的宏块(即该宏块的参考帧)的视频编码均已完成,这样不仅可以使用宏块左侧的宏块的编码重建结果进行帧内预测编码,还可以使用该宏块左上方的宏块、正上方的宏块和右上方的宏块的编码重建结果进行帧内预测编码,在实现了帧内并行视频编码的基础上,大大提高了为宏块找到最佳预测像素值的概率,进而降低了宏块视频编码后的码率,提高了视频编码的速度,从而降低了视频编码后的视频图像数据的码率,提高了视频编码的速度。进一步地,在上述实施例的基础上,本实施例涉及的是视频编码器如何将宏块的量化步长的差值写入宏块的编码数据中的具体过程。现有技术中,为了进一步去除所编码的宏块中的冗余信息,因此,视频编码器在每个宏块的编码数据中,并不会写入每个宏块的量化步长,而是将每个宏块与上一宏块的量化步长之间的差值写入编码数据中。继续参照上述表2和表3所述的示例,以第三排的第一个宏块(编号为5)为例,其中,第二子进程用于对第三排的第一个宏块(编号为5)进行编码,该宏块(第三排的第一个宏块,编号为5)的前一个宏块为第二排的第五个宏块(编号为7),但是根据本实施例所提供的编码方法,第二子进程在对第三排的第一个宏块(编号为5)进行编码时,还没有进程对第二排的第五个宏块(编号为7)进行编码,也就是说,还没有第二排的第五个宏块(编号为7)的量化步长的信息,因此,第二子进程就无法将该宏块(第三排的第一个宏块,编号为5)与该宏块的前一个宏块(第二排的第五个宏块,编号为7)的量化步长的差值写入该宏块的编码数据中,为了确保对该宏块的编码顺利进行,有如下两种解决方式:第一种:将待编码阵列中每行宏块的最后一个宏块的量化步长预先设定为一常数,该预先设定的常数具体可以根据用户需求确定。图4为本发明提 供的视频编码方法实施例四的流程示意图,如图4所示,在上述S307之后,该方法还可以包括如下步骤:S401:在对第i个宏块进行熵编码完成后,根据第i个宏块与相邻的前一宏块的量化步长,确定第i个宏块与相邻的前一宏块的量化步长的差值。S402:将第i个宏块与相邻的前一宏块的量化步长的差值写入第i个宏块的编码数据中。S403:将第i个宏块的编码数据写入码流缓冲区中。具体的,在本实施例中,第i个宏块即为第三排的第一个宏块(编号为5)。继续参照上述示例,上述第二排的第五个宏块(编号为7)为第二排的最后一个宏块,则对该第二排的第五个宏块(编号为7)进行编码时,会对该第二排的第五个宏块(编号为7)使用预先设定的量化步长,这样,当第二子进程对第三排的第一个宏块(编号为5)进行编码时,即便还没有进程对第二排的第五个宏块(编号为7)进行编码,但是由于视频编码器会对该第二排的第五个宏块(编号为7)使用预先设定的量化步长,所以第二子进程就可以根据为该第二排的第五个宏块(编号为7)预先设定的量化步长,确定该宏块(第三排的第一个宏块,编号为5)与该宏块的前一个宏块(第二排的第五个宏块,编号为7)的量化步长的差值,并可以将确定量化步长的差值再写入该宏块(第三排的第一个宏块,编号为5)的编码数据中。这样,第二子进程就完成了该宏块(第三排的第一个宏块,编号为5)的编码,从而就可以将该宏块(第三排的第一个宏块,编号为5)的编码数据写入码流缓存区中,以使得视频编码器在完成该宏块所在的待编码阵列中所有的宏块的编码之后,就可以发送该编码数据。第二种:待编码阵列中每行宏块的最后一个宏块的量化步长为,视频编码器为该宏块进行编码时所确定的量化步长。图5为本发明提供的视频编码方法实施例五的流程示意图,如图5所示,在本实施例中,上述视频编码器在对每个宏块进行编码时,均不对宏块的量化步长进行熵编码,而是在视频编码器对待编码阵列的所有宏块的其他部分(即除宏块的量化步长的所有部分)都进行熵编码完成后,也就是视频编码器对待编码阵列的每个宏块的其他部分都执行完上述S307之后,即,在对所有宏块编码完成后,在将所有宏块的熵编码码流拼接时再写入量化步长信息(即每个宏块与其相邻的前一宏 块的量化步长的差值),该方法具体可以包括如下步骤:S501:确定每个宏块与相邻的前一宏块的量化步长的差值。S502:将每个宏块与相邻的前一宏块的量化步长的差值分别写入每个宏块的编码数据。S503:将待编码阵列的所有宏块的编码数据写入码流缓存区中。具体的,与上一实施例不同的是,本实施例并不预先设定待编码阵列中每行宏块的最后一个宏块的量化步长,而是在对待编码阵列中每行宏块的最后一个宏块进行编码时,才确定其量化步长,因此,本实施例中,视频编码器在对待编码阵列中的每个宏块进行编码时,在每个宏块的编码数据中并不写入该宏块与其前一个宏块之间的量化步长的差值,也不将每个宏块的编码数据写入最终的码流缓冲区,而是在视频编码器完成该待编码阵列中的所有宏块的编码之后,即在视频编码器完成该待编码阵列中的所有宏块的其他部分都完成熵编码之后,也就是说,所有宏块的量化步长均已知的情况下,包括待编码阵列中每行宏块的最后一个宏块的量化步长均已知的情况下,再确定每个宏块与相邻的前一宏块的量化步长的差值,并将确定的每个宏块与相邻的前一宏块的量化步长的差值再写入该宏块的编码数据中。这样,视频编码器在将待编码阵列中的每个宏块的量化步长的差值都写入到该宏块对应的编码数据之后,就可以将该待编码阵列中的所有宏块的编码数据写入码流缓存区中,以使得视频编码器可以发送该编码数据,至此就完成了待编码数据的编码。本发明所提供的视频编码方法,通过将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块的分组方式,且通过同一宏块组的宏块并行进行视频编码的方式,使得在对待编码阵列中每个宏块进行帧内预测编码时,该宏块左侧的宏块、左上方的宏块、正上方的宏块和右上方的宏块(即该宏块的参考帧)的视频编码均已完成,这样不仅可以使用宏块左侧的宏块的编码重建结果进行帧内预测编码,还可以使用该宏块左上方的宏块、正上方的宏块和右上方的宏块的编码重建结果进行帧内预测编码,在实现了帧内并行视频编码的基础上,大大提高了为宏块找到最佳预测像素值的概率,进而降低了宏块视频编码后的码率,提高了视频编码的速度,从而降低了视频编码后的视频图像数据的码率,提高了视频编码的速度。本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。图6为本发明提供的视频编码器实施例一的结构示意图,如图6所示,本实施例提供的视频编码器可以包括:确定模块11、分组模块12和编码模块13,其中,确定模块11,用于确定待编码视频图像数据的待编码阵列,其中,待编码阵列包括m×n个宏块,m和n均为大于1的正整数;分组模块12,用于对待编码阵列中的宏块进行分组,其中,在分组过程中,将前一个宏块组的宏块作为参考帧,确定前一个宏块组的参考帧对应的预测帧,将前一个宏块组的参考帧对应的预测帧作为当前宏块组的宏块;编码模块13,用于启动N个进程并行对待编码阵列中的宏块进行编码,其中,N个进程每一轮并行对一个宏块组进行编码,每一轮编码过程中每个进程对宏块组中的至少一个宏块进行编码。本实施例提供的视频编码器,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。进一步地,在上述实施例的基础上,上述分组模块12,用于对待编码阵列中的宏块进行分组,具体为:上述分组模块12,具体用于将待编码阵列中的第一列宏块作为参考帧,并将第一列宏块的编号设置为从小到大的连续奇数或连续偶数;将第一列宏块的编号加1作为相邻的后一宏块的编号,其中,相邻的后一宏块为第一列宏块对应的预测帧;对待编码阵列中的其他宏块进行编号,其中,其他宏块的编号为相邻的前一宏块的编号加1,相邻的前一宏块为其他宏块对应的参考帧;将待编码阵列中编号相同的宏块划分到一个宏块组中;则上述编码模块13,用于启动N个进程并行对待编码阵列中的宏块进行编码,具体为:上述编码模块13,具体用于启动N个进程并行对待编码阵列中的宏块进行编码,N个进程每一轮并行对一个宏块组进行编码,各轮之间按照待编码 阵列中宏块组中的宏块对应的编号由小到大执行。本实施例提供的视频编码器,可以用于执行图2所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。进一步地,在上述实施例的基础上,图7为本发明提供的视频编码器实施例二的结构示意图,如图7所示,上述编码模块13,具体可以包括确定单元131、变换单元132、量化单元133和熵编码单元134;其中,确定单元131,用于针对第i个宏块,当所述第i个宏块的预测编码的类型为帧内预测编码时,则确定所述第i个宏块的帧内预测编码模式,根据确定的所述第i个宏块的帧内预测编码模式,从已经编码的宏块中确定第i个宏块的预测像素值,并确定第i个宏块和预测像素值的残差;其中,第i个宏块为待编码阵列中的宏块中的任意一个宏块;变换单元132,用于对第i个宏块和预测像素值的残差进行变换;确定单元131,还用于确定第i个宏块的量化步长;量化单元133,用于根据第i个宏块的量化步长对变换后的数据进行量化;熵编码单元134,用于对量化后的数据进行熵编码得到所述第i个宏块的编码数据。本实施例提供的视频编码器,可以用于执行图3所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。在本实施例的一种实现方式中,图8为本发明提供的视频编码器实施例三的结构示意图,如图8所示,当上述待编码阵列中每行宏块的最后一个宏块的量化步长为预先设定的常数,上述视频编码器还可以包括:第一确定模块14和第一写入模块15;其中,第一确定模块14,用于在对第i个宏块进行熵编码完成后,根据第i个宏块与相邻的前一宏块的量化步长,确定第i个宏块与相邻的前一宏块的量化步长的差值;第一写入模块15,用于将第i个宏块与相邻的前一宏块的量化步长的差值写入第i个宏块的编码数据中;并将第i个宏块的编码数据写入码流缓冲区中。本实施例提供的视频编码器,可以用于执行图4所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。在本实施例的另一种实现方式中,图9为本发明提供的视频编码器实施例四的结构示意图,如图9所示,当上述待编码阵列中每行宏块的最后一个宏块的量化步长为,视频编码器为该宏块进行编码时所确定的量化步长时,上述视频编码器还可以包括:第二确定模块16和第二写入模块17;其中,第二确定模块16,用于在待编码阵列的所有宏块都进行熵编码完成后,确定每个宏块与相邻的前一宏块的量化步长的差值;第二写入模块17,用于将每个宏块与相邻的前一宏块的量化步长的差值分别写入每个宏块的编码数据中;并将待编码阵列的所有宏块的编码数据写入码流缓存区中。本实施例提供的视频编码器,可以用于执行图5所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1