x264的CABAC熵编码技术
- 格式:pdf
- 大小:149.16 KB
- 文档页数:2
浅析H.264标准中的CA VLC编码[摘要]本文是在阅读了讲解H.264/A VC中熵编码相关内容的书籍后的感想,主要介绍了熵编码的基本原理,H.264/A VC中熵编码的方法,重点介绍了基于上下文自适应的可变长编码(CA VLC),并将它和基于上下文二进制算术编码(CABAC)进行了比较。
【关键词】熵编码;编码算法;编码比较H.264是在网络技术和视频业务不断发展的情况下产生的新一代视频压缩编码标准,它是由国际标准化组织与国际电讯联盟组成的联合视频小组开发的。
与原有标准相比,H.264提出了许多新技术,在诸多方面都超越了原有的视频技术,减少了占用的硬件资源,降低了实现复杂性。
其中就包括全新的熵编码技术。
1、熵编码编码使用长度不同的比特串对字母进行编码有一定的困难。
尤其是几乎所有几率的熵都是一个有理数。
使用整数位元(bit)哈夫曼编码建议了一种将位元进位成整数的算法,但这个算法在特定情况下无法达到最佳结果。
为此有人加以改进,提供最佳整数位元数。
这个算法使用二叉树来设立一个编码。
这个二叉树的终端节点代表被编码的字母,根节点代表使用的位元。
熵编码模型要确定每个字母的比特数算法需要尽可能精确地知道每个字母的出现机率。
模型的任务是提供这个数据。
模型的预言越好压缩的结果就越好。
此外模型必须在压缩和恢复时提出同样的数据。
在历史上有许多不同的模型。
静态模型静态模型在压缩前对整个文字进行分析计算每个字母的机率。
这个计算结果用于整个文字上。
优点:编码表只需计算一次,因此编码速度高。
除在解码时所需要的机率值外结果肯定不比原文长。
缺点:计算的机率必须附加在编码后的文字上,这使得整个结果加长。
计算的机率是整个文字的机率,因此无法对部分地区的有序数列进行优化。
动态模型在这个模型里机率随编码过程而不断变化。
多种算法可以达到这个目的:前向动态:机率按照已经被编码的字母来计算,每次一个字母被编码后它的机率就增高。
反向动态:在编码前计算每个字母在剩下的还未编码的部分的机率。
⾳视频编码⼀些参数解析:码流、码率、⽐特率、帧速率、分辨率、⾼清的区别GOP/ 码流 /码率 / ⽐特率 / 帧速率 / 分辨率GOP(Group of picture)关键帧的周期,也就是两个IDR帧之间的距离,⼀个帧组的最⼤帧数,⼀般的⾼视频质量⽽⾔,每⼀秒视频⾄少需要使⽤ 1 个关键帧。
增加关键帧个数可改善质量,但是同时增加带宽和⽹络负载。
需要说明的是,通过提⾼GOP值来提⾼图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会⾃动强制插⼊⼀个I帧,此时实际的GOP值被缩短了。
另⼀⽅⾯,在⼀个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量⽐较差时,会影响到⼀个GOP中后续P、B帧的图像质量,直到下⼀个GOP开始才有可能得以恢复,所以GOP值也不宜设置过⼤。
同时,由于P、B帧的复杂度⼤于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。
另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前⾯的I或P帧预测得到的,所以Seek操作需要直接定位,解码某⼀个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。
CABAC/CAVLCH.264/AVC标准中两种熵编码⽅法,CABAC叫⾃适应⼆进制算数编码,CAVLC叫前后⾃适应可变长度编码,CABAC:是⼀种⽆损编码⽅式,画质好,X264就会舍弃⼀些较⼩的DCT系数,码率降低,可以将码率再降低10-15%(特别是在⾼码率情况下),会降低编码和解码的速速。
CAVLC将占⽤更少的CPU资源,但会影响压缩性能。
帧:当采样视频信号时,如果是通过逐⾏扫描,那么得到的信号就是⼀帧图像,通常帧频为25帧每秒(PAL制)、30帧每秒(NTSC 制);场:当采样视频信号时,如果是通过隔⾏扫描(奇、偶数⾏),那么⼀帧图像就被分成了两场,通常场频为50Hz(PAL制)、60Hz(NTSC制);帧频、场频的由来:最早由于抗⼲扰和滤波技术的限制,电视图像的场频通常与电⽹频率(交流电)相⼀致,于是根据各地交流电频率不同就有了欧洲和中国等PAL制的50Hz和北美等NTSC制的60Hz,但是现在并没有这样的限制了,帧频可以和场频⼀样,或者场频可以更⾼。
中文版MeGUI的x264编码配置在MeGUI用内置工具AVS创建一个简单脚本(这里暂时不介绍AVS的各种滤镜使用参数),要求在点击DirectShowsource(手工、专业)能弹出视频预览窗就可以保存AVS了。
此时内建的AVS会自动加载到MeGUI 主界面,进入本文主题压制参数x264配置。
用内置工具建AVS脚本保存后会自动加载到MeGUI界面(AVS的保存最好和视频同在一起)视频输出,注意MeGUI分配的路径是和源视频同一处的,如果本身源视频就是mkv的那么视频输出要改一下视频名称或是存放路径,以免被覆盖转制出错。
没有勾选―显示高级设置‖英文―Show Advanced Setting‖设置界面没有显示完全。
勾选―显示高级设置‖后,配置界面完全显示出来,主要主要面板:编码模式有这么几种:ABR \ Const.Quantizer \ 2pass –1st pass \…… \ Const.Quality,说说常用的,ABR:平均码率,做动画基本不用,Const Quality:恒定质量模式(追求质量不计码率和容量大小的片子使用),一次编码,做动画基本不用,xPass:x次处理,能做到动态高码率,静态低码率,看到很多动画在激烈的打斗场面的时候都会有很高的码流,甚至有10m,20m的说,但是,在静态画面的时候码流较低,这是为了使体积都用在最需要的时候,如果激烈战斗的动态画面码率低的话那么就什么都看不清楚了…所以2pass 对于压缩后片子的整体质量有所提高。
对于那么多的编码模式,最终要用的都是:Auto-2PASS,两次的编码压缩使得码率低,体积更小,质量也高,但是消耗的时间是CQ模式的大约一倍,CQ模式相当于只跑了第2PASS,而2PASS模式还要跑完第一PASS才跑第二PASS。
(加入列队编码时注意到,自动二次编是要跑完两个x264才完成视频输出,时间久就是因为这样来的。
)BITRATE:码率设置,以kbps为单位,片源好以1500kbps以上压制成1024X576的片子体积能减三倍以上,当然码率越高和源的差别越小。
X264-libx264编码库X264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。
编码帧的类型分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H264中叫做图像⽚Slice。
X264把整帧图像看作⼀个Slice,⽚中有slice_type_i、slice_type_p、slice_type_b之分。
I帧只有slice_type_i,P帧有slice_type_i、slice_type_p,B帧三种⽚都有。
X264的H264视频编码过程可以分为三个步骤:⾸先根据规则判定当前帧的编码类型,如果是B帧,要缓冲存放、获取;然后对待编码图像进⾏帧内预测、帧间预测、整数DCT变换、量化和熵编码;最后把压缩的H264数据进⾏NAL层打包输出。
X264编码器有关的重要结构体:x264_image_t:实际参与编码的编码帧图像信息。
typedef struct{int i_csp; //图像空间颜⾊int i_plane; //图像平⾯数⽬int i_stride[4]; //每个图像平⾯的跨度,也就是每⼀⾏数据的字节数uint8_t *plane[4]; //每个图像平⾯存放数据的起始地址,plane[0]是Y平⾯,plane[1]是U平⾯,plane[2]是V平⾯}x264_image_t; //待编码的图像x264_picture_t:x264编码器定义便于控制的图像帧,描述⼀帧的特征。
包含x264_image_t和x264_param_t结构体。
typedef struct{int i_type; //帧的类型,初始化为auto,在编码过程⾃⾏控制int i_qpplus1; //此参数减1代表当前帧的量化参数值int i_pic_struct; //帧的结构类型int b_keyframe; //输出是否是关键帧int64_t i_pts; //⼀帧的显⽰时间戳int64_t i_dts; //输出解码时间戳x264_param_t *param;x264_image_t img;x264_image_properties_t prop;x264_hrd_t hrd_timing;void *opaque;} x264_picture_t; //x264编码视频帧x264_param_t:初始化编码器。
高清CABAC解码器的优化设计和实现陈杰;丁丹丹;虞露【摘要】Aiming at the problem that the strong data dependency and low parallelism in Context-based Adaptive Binary Arithmetic Coding (CABAC), this paper proposes an optimized real time CABAC decoding architecture for H.264/AVC high profile in HD application. The architecture is based on the two-level storage structure and adopts syntax element prediction and merging strategies, optimizes the decoding decision processing and reuses the de-binarization circuits. Test results show that the architecture achieves a high performance with a low cost, and it is sufficient for HD application in FPGA.%针对基于上下文的自适应二进制算术编码(CABAC)解码过程中数据依赖性强、并行度低的问题,提出一种优化的硬件结构来实现H.264/AVC高级档次高清视频序列的实时解码.该结构基于二级存储结构,采用语法元素合并和预测技术,对解码判决过程进行优化并对反二值化模块的电路进行复用.测试结果表明,该系统在较小的面积下能达到较高的性能,在FPGA上可以满足高清视频序列的实时CABAC 解码需求.【期刊名称】《计算机工程》【年(卷),期】2012(038)023【总页数】4页(P273-276)【关键词】H.264/AVC高级档次;视频编码;基于上下文的自适应二进制算术编码解码;二级存储结构【作者】陈杰;丁丹丹;虞露【作者单位】浙江大学信息与通信工程研究所,杭州310027;浙江大学信息与通信工程研究所,杭州310027;浙江大学信息与通信工程研究所,杭州310027【正文语种】中文【中图分类】TP3911 概述H.264/AVC是MPEG和ITU-T共同制定的新一代高性能视频编码标准,在相同图像质量下,其压缩效率要远远高于 MPEG2、H.263、MPEG4等标准[1]。
x264命令行参数解释使用格式:x264 默认选项 -o 输出文件输入文件 [长x宽]输入支持格式:RAW/y4m/avi/avs(编译时可选)输出支持格式:264/mkv/mp4(编译时可选)x264的许多参数可以有-/--两种输入法,笔者也不知道为什么。
以下等价参数用“参数1/参数2 <必需数值格式>”表示,参数尾部()内为个人推荐。
-h/--help 帮助帧类型选项:-I/--keyint <整数> 最大IDR帧间距,默认250-i/--min-keyint <整数> 最小IDR帧间距,默认25--scenecut <整数> 画面动态变化限,当超出此值时插入I帧,默认40-b/--bframes <整数> 在IP帧之间可插入的B帧数量最大值,范围0~16,默认0--no-b-adapt 关闭自适应B帧判定(-b设为1时可用,其他不推荐)--b-bias <整数> 控制插入B帧判定,范围-100~+100,越高越容易插入B帧,默认0--b-pyramid 允许B帧做参考帧--no-cabac 关闭内容自适应二进制算术编码(CABAC,高效率的熵编码)(会提高速度,但严重影响质量)-r/--ref <整数> 最大参考帧数,范围0~16,默认1--nf 关闭环路滤波(一种除马赛克算法)-f/--filter <alpha:beta>设置环路滤波的AlphaC和Beta的参数,范围-6-6,默认都为0码率控制选项:-q/--qp <整数> 固定量化模式并设置使用的量化值,范围0~51,0为无损压缩,默认26-B/--bitrate <整数> 设置平均码率--crf <整数> 质量模式,量化值动态可变(目前不太成熟,质量不如设置固定量化值)--qpmin <整数> 设置最小量化值,范围0~51,默认10--qpmax <整数> 设置最大量化值,范围0~51,默认51--qpstep <整数> 设置相邻帧之间的量化值差,范围0~50,默认4--ratetol <小数> 平均码率模式下,瞬时码率可以偏离的倍数,范围0.1~100.0,默认1.0 --vbv-maxrate <整数> 平均码率模式下,最大瞬时码率,默认0(与-B设置相同)--vbv-bufsize <整数> 码率控制缓冲区的大小,单位kbit,默认0--vbv-init <小数> 码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.0,默认0.9--ipratio <小数> I帧和P帧之间的量化系数,默认1.40--pbratio <小数> P帧和B帧之间的量化系数,默认1.30--色度-qp-offset <整数> 色度和亮度之间的量化差,范围-12~+12,默认0-p/--pass <1|2|3> 多次压缩码率控制1:第一次压缩,创建统计文件2:按建立的统计文件压缩并输出,不覆盖统计文件,3:按建立的统计文件压缩,优化统计文件--stats <字符串> 统计文件的名称,默认"x264_2pass.log"--rceq <字符串> 速率控制公式,默认"blurCplx^(1-qComp)"--qcomp <小数> 线性量化控制,0.0为固定码率,1.0为固定量化值,默认0.6,只用于2-pass 和质量模式--cplxblur <小数> 根据相邻帧平滑量化值比例的最大值,范围0~99.9,默认20.0,只用于2-pass和质量模式--qblur <小数> 对统计文件结果平滑量化值比例的最大值,范围0~99.9,默认0.5,只用于2-pass--zones <z0>/<z1>/…分段量化,格式为:<开始帧>,<结束帧>,<选项>,可选项为:q=<整数>(量化值)或b=<小数>(码率倍数)分析选项:-A/--analyse <字符串> 动态块划分方法,默认"p8x8,b8x8,i8x8,i4x4"。
cabac 熵编码
Cabac(Context-Adaptive Bit Allocation Code,自适应比特分配编码)是一种熵编码方法,主要用于图像和视频压缩领域。
它是一种基于上下文的熵编码技术,能够根据图像或视频中的上下文信息自适应地分配比特资源,从而实现更高的压缩比和更好的图像质量。
Cabac编码的主要特点如下:
1. 自适应比特分配:Cabac编码根据图像块的纹理复杂度和边缘信息,自适应地分配比特资源,使得重要的图像细节得到更好的保护。
2. 上下文感知:Cabac编码利用前一帧或当前帧的其他相关像素的信息,为每个像素分配合适的比特数,从而提高编码效率。
3. 编码效率高:与传统的霍夫曼编码相比,Cabac编码具有更高的编码效率,能够在相同的压缩比下实现更好的图像质量。
4. 适应性强:Cabac编码能够适应不同的图像和视频内容,实现高质量的压缩效果。
5. 兼容性好:Cabac编码可以与其他熵编码方法相结合,如LZW、RLZ
等,形成混合编码方案,进一步提高压缩性能。
在我国,Cabac编码技术在数字电视、视频监控等领域得到了广泛应用。
随着压缩技术的不断发展和优化,Cabac编码在图像和视频压缩领域的优势将继续凸显。
图像编码是一门关于将图像数据进行压缩和编码的技术。
熵编码是图像编码中常用的一种方法,其通过统计图像数据中的统计特性,将出现频率较高的像素值编码为较短的二进制码,而出现频率较低的像素值编码为较长的二进制码,从而达到压缩图像数据的目的。
本文将详细介绍熵编码的原理和常见的熵编码方法。
一、熵编码的原理熵编码的原理基于信息论中的熵概念,熵是度量信息量的一个指标,表示一个随机变量平均需要多少信息来表示。
在图像编码中,熵即为图像数据中的不确定性或不规律性,熵越高,图像数据的复杂度越大。
熵编码的目标是利用统计特性将出现频率较高的像素编码为较短的码字,而出现频率较低的像素编码为较长的码字。
这样一来,出现频率较高的像素值编码后的二进制码的长度较短,从而达到压缩图像数据的目的。
二、哈夫曼编码哈夫曼编码是最常见的一种熵编码方法,它通过构建一颗哈夫曼树来实现编码。
首先,统计图像中每个像素值的出现频率,然后构建一颗哈夫曼树。
在哈夫曼树中,出现频率较高的像素值编码为较短的码字,而出现频率较低的像素值编码为较长的码字。
最后,根据构建好的哈夫曼树,对图像数据进行编码。
三、算术编码算术编码也是一种常用的熵编码方法,它将整个图像看作一个整体,通过将图像中的每个像素值产生的条件概率进行累乘,得到整个图像的条件概率。
然后,根据条件概率对图像数据进行编码,编码时通过二分搜索来确定编码的区间。
四、自适应编码自适应编码是一种逐行或逐列扫描整个图像进行编码的方法。
在自适应编码中,每次编码一个像素值,然后根据编码结果来更新编码表,使得出现频率较高的像素值编码为较短的二进制码。
自适应编码的优点是适应性强,可以根据图像的统计特性动态地调整编码结果。
五、总结熵编码是图像编码中的一种重要方法,通过统计图像数据的统计特性,将出现频率较高的像素值编码为较短的码字,从而达到压缩图像数据的目的。
常见的熵编码方法包括哈夫曼编码、算术编码和自适应编码等。
不同的熵编码方法适用于不同的图像数据特性和编码需求,选择合适的编码方法可以提高图像的压缩率。