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编码在图像和视频压缩领域的优势将继续凸显。
图像编码是一门关于将图像数据进行压缩和编码的技术。
熵编码是图像编码中常用的一种方法,其通过统计图像数据中的统计特性,将出现频率较高的像素值编码为较短的二进制码,而出现频率较低的像素值编码为较长的二进制码,从而达到压缩图像数据的目的。
本文将详细介绍熵编码的原理和常见的熵编码方法。
一、熵编码的原理熵编码的原理基于信息论中的熵概念,熵是度量信息量的一个指标,表示一个随机变量平均需要多少信息来表示。
在图像编码中,熵即为图像数据中的不确定性或不规律性,熵越高,图像数据的复杂度越大。
熵编码的目标是利用统计特性将出现频率较高的像素编码为较短的码字,而出现频率较低的像素编码为较长的码字。
这样一来,出现频率较高的像素值编码后的二进制码的长度较短,从而达到压缩图像数据的目的。
二、哈夫曼编码哈夫曼编码是最常见的一种熵编码方法,它通过构建一颗哈夫曼树来实现编码。
首先,统计图像中每个像素值的出现频率,然后构建一颗哈夫曼树。
在哈夫曼树中,出现频率较高的像素值编码为较短的码字,而出现频率较低的像素值编码为较长的码字。
最后,根据构建好的哈夫曼树,对图像数据进行编码。
三、算术编码算术编码也是一种常用的熵编码方法,它将整个图像看作一个整体,通过将图像中的每个像素值产生的条件概率进行累乘,得到整个图像的条件概率。
然后,根据条件概率对图像数据进行编码,编码时通过二分搜索来确定编码的区间。
四、自适应编码自适应编码是一种逐行或逐列扫描整个图像进行编码的方法。
在自适应编码中,每次编码一个像素值,然后根据编码结果来更新编码表,使得出现频率较高的像素值编码为较短的二进制码。
自适应编码的优点是适应性强,可以根据图像的统计特性动态地调整编码结果。
五、总结熵编码是图像编码中的一种重要方法,通过统计图像数据的统计特性,将出现频率较高的像素值编码为较短的码字,从而达到压缩图像数据的目的。
常见的熵编码方法包括哈夫曼编码、算术编码和自适应编码等。
不同的熵编码方法适用于不同的图像数据特性和编码需求,选择合适的编码方法可以提高图像的压缩率。
【基本定义】x264是一种免费的、具有更优秀算法的H.264/MPEG-4 AVC视频压缩编码格式。
它同xvid一样都是开源项目,但x264是采用H.264标准的,而xvid是采用MP EG-4早期标准的。
由于H.264是2003年正式发布的最新的视频编码标准,因此,在通常情况下,x264压缩出的视频文件在相同质量下要比xvid压缩出的文件要小,或者也可以说,在相同体积下比xvid压缩出的文件质量要好。
它符合GPL许可证。
[编辑本段]【X.264起源】X.264起源于H.264技术,是H.264的的变种版本。
与H.264相比,X.264是针对业余市场推出的一个免费编码格式,是H.264的子集,只能能实现H.264的部分功能。
X.264多见于网络上流传的重压缩的视频内容[编辑本段]【X.264特点】特点:日前,x264是最新的AVC编码格式之一。
■ 采用CAVLC/CABAC多种算法编码■ 内置所有macroblock格式(16x16, 8x8, and 4x4 )X.264界面■ Inter P:所有的分割块(从16x16到4x4 )■ Inter B:分割块从16x16到8x8■ 码率控制:恒定的分层编制,单次或多次的ABR压制,可选的VBV压制■ 场景剪切侦测■ 支持B-frame■ 能够任意编制B-frame命令行■ 无损模式■ 8x8和4x4的格式能够进行翻转或旋转■ 自定义精确的矩阵模板■ 可在多个CPU平行编码■ 隔行扫描[编辑本段]【技术区别】x264x264是一个基于h.264的免费开源的视频Codec,属于后起之秀,已经受到众多Riper的青睐,但是与Xvid相比,其在解码时对硬件的要求更高。
H.264H.264是由国际电信联盟(ITU-T)所制定的新一代的视频压缩格式。
H.264最具价值的部分无疑是更高的数据压缩比。
在同等的图像质量条件下,H.264的数据压缩比能比当前DVD系统中使用的MPEG-2高2-3倍,比MPEG-4高1.5-2倍。
H.264/AVC中的CABAC编码技术彭 芬(武汉职业技术学院电子信息工程系,湖北武汉430074)摘 要:CA BAC是新一代视频压缩算法标准H.264/A VC中采用的新熵编码技术,使用它可以有效提高编码效率,节约码流。
这里介绍了CA BAC编码中算术编码理论的原理和内容模型的基本类型,并以运动矢量差值M VD的编码方法为例详细分析了CABAC的编码过程。
关键词:CA BAC;二进制算术编码;内容模型;H.264/AV C中图分类号:T N919 文献标识码:A0 引言H.264/A VC标准是视频编码专家组(VCEG)和运动图像专家组(M PEG)组成的联合视频组(JV T)研究而成的,该标准于2003年3月正式获得批准。
H.264/A VC支持两种熵编码方法:可变长编码(VL C)和基于内容的自适应二进制算术编码(CA BAC)。
U VL C是从概率统计分布模型得出的,应用单一的码表,没有考虑编码符号间的相关性,不允许根据实际符号的统计特性进行调整。
而实际符号的统计特性会随着空间、时间、视频源、编码条件的变化而发生变化,U V LC用于编码中高比特率视频流信息时性能不理想。
然而高比特视频信息的低码率应用如因特网上的流媒体、无线网的视频传输及视频存储等呼之欲出,对视频压缩编码技术的编码效率提出了新的挑战。
基于内容的自适应二进制算术编码(CABAC)方法根据相邻块的情况进行当前块的编码,充分考虑编码符号间的相关性,可以达到更好的编码效率。
1 CABAC的编码原理1.1 二进制算术编码1.1.1 算术编码基本理论算术编码的基本原理是将编码的消息表示成实数0和1之间的一个区间,消息越长,编码表示它的区间就越小,表示这一区间所需的二进制位就越多。
算术编码机制由两个数区间下界和区间范围进行界定。
区间下界、区间范围的确定方法:新子区间的下界=前子区间的下界+当前符号的区间累计概率x前子区间的宽度。
新区间范围R新=R P(R新是新子区间的宽度,R是前子区间的宽度,P是当前符号的概率)对每一符号,算术编码器按步骤A和B进行处理。
x264源代码解析x264编码详细文字全过程(1)x264_param_default( x264_param_t *param )作用:对编码器进行参数设定cqm:量化表相关信息csp:量化表相关信息里的memset( param->cqm_4iy, 16, 16 );memset( param->cqm_4ic, 16, 16 );memset( param->cqm_4py, 16, 16 );memset( param->cqm_4pc, 16, 16 );memset( param->cqm_8iy, 16, 64 );memset( param->cqm_8py, 16, 64 ); (2)static int Parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt ) 初始化1.getopt_long(nargc, nargv, options, long_options, idx) 得到入口地址的向量与方式的选则2.getopt_internal(nargc, nargv, options) 解析入口地址向量(3)static int Encode( x264_param_t *param, cli_opt_t *opt )/* Create a copy of param */ h->param=param/* VUI */vui信息主要包括帧率、图像尺寸等信息/* Init x264_t */x264_sps_init( h->sps, 0, &h->param );序列图像集x264_pps_init( h->pps, 0, &h->param, h->sps);图像参数集/* Init frames. */ 初始化并开辟帧空间/* init mb cache */ 对前一宏块的信息保存,因为是初始化,所以作为第一个宏块的参考,后面会有x264_macroblock_cache_load( h, i_mb_x, i_mb_y );它是将要编码的宏块的周围的宏块的值读进来, 要想得到当前块的预测值,要先知道上面,左面的预测值/* init cabac adaptive model *//* init CPU functions */ 初始化cpu对各种分块的参数设定/* rate control */1.x264_t *x264_encoder_open ( x264_param_t *param ) 这个函数是对不正确的参数进行修改,并对各结构体参数和cabac编码,预测等需要的参数进行初始化2、p_read_frame( &pic, opt->hin, i_frame + opt->i_seek, param->i_width, param->i_height )读取一帧,并把这帧设为prev3. i_file += Encode_frame( h, opt->hout, &pic );进入核心码层核心编码层的总流程图:(x264.c)1.x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )对帧进行编码2.i_size = x264_nal_encode( data, &i_data, 1, &nal[i] ) 网络打包编码3.i_file += p_write_nalu( hout, data, i_size ) 把网络包写入到输出文件中去4.返回,对下一帧进行编码下面一页是详细的流程图:一.帧内详细流程图:(1).x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )对帧进行编码1./* 1: Copy the picture to a frame and move it to a buffer */x264_frame_t*fenc=x264_frame_get( h->frames.unused );x264_frame_copy_picture( h, fenc, pic_in );fenc->i_frame = h->frames.i_input++;x264_frame_put( h->frames.next, fenc );x264_frame_init_lowres( h->param.cpu, fenc );//里面包含低象素的扩展,很多for循环,应该是抽头计算和半精度象素的扩展,要认真看(2).264_slicetype_decide( h );对slice类型的判定,里面也要看一下(3).while( IS_X264_TYPE_B( h->frames.next[bframes]->i_type ) ) bframes++;x264_frame_put(h->frames.current,x264_frame_get( &h->frames.next[bframes] ) );这主要是因为B帧必须等后面的非B帧编码结束后才能编码,所以把暂时不编的一系列B帧存入队列中,一直到非B帧才取出进行编码,之后再进行前面的B帧编码do_encode:(4).建立list0 & list1.我感觉x264_reference_build_list( h, h->fdec->i_poc, i_slice_type );比特率控制初始化x264_ratecontrol_start(h, i_slice_type, h->fenc->i_qpplus1 );(5).创建slice的头部数据x264_slice_init( h, i_nal_type, i_slice_type, i_global_qp );(6)i_frame_size = x264_slices_write( h );这是编码的关键了1. x264_slice_header_write(&h->out.bs,&h->sh,h->i_nal_ref_idc ); /* Slice header */2. 一些初始化工作3. for(mb_xy=h->sh.i_first_mb, i_skip = 0; mb_xy < h->sh.i_last_mb; mb_xy++ )对一个slice中每个宏块进行循环遍历编码,其中const int i_mb_y = mb_xy / h->sps->i_mb_width;和const int i_mb_x = mb_xy % h->sps->i_mb_width;是对宏块位置在slice中的x,y坐标的定位,这个for语句几乎覆盖了整个x264_slices_write()函数4. x264_macroblock_cache_load( h, i_mb_x, i_mb_y ); 它是将要编码的宏块的周围的宏块的值读进来, 要想得到当前块的预测值,要先知道上面,左面的预测值!5. *****x264_macroblock_analyse( h );重点。
图像编码是一种将图像数据转换为二进制序列以便传输或存储的过程。
在图像编码中,熵编码方法起到了重要的作用。
在本文中,我们将详细解释熵编码方法在图像编码中的原理和应用。
一、熵编码方法简介熵编码是一种基于信息论的编码方法,旨在通过最小化编码序列的熵来减少传输或存储数据所需的比特数。
熵编码方法的核心思想是,通过使用较短的二进制码字表示出现频率较高的符号,以实现数据压缩的目的。
二、香农熵和离散概率分布在熵编码中,我们需要先计算出符号的概率分布。
而概率分布可以通过香农熵来度量。
香农熵是根据概率分布来计算信息源的信息量的度量标准。
在图像编码中,我们可以将像素值视为符号,并根据频率统计来计算符号集的概率分布。
三、霍夫曼编码霍夫曼编码是熵编码中最为常用的方法之一。
它通过构建霍夫曼树来生成最优的编码方案,即通过较短的编码长度来表示出现频率较高的符号。
霍夫曼编码的前提是符号的概率分布已知,通过构建霍夫曼树可以得到每个符号的二进制码字。
四、算术编码算术编码是另一种常用的熵编码方法,在图像编码中也得到了广泛应用。
与霍夫曼编码不同,算术编码不需要预先构建编码表,而是将整个消息序列视为一个整体进行编码。
算术编码通过不断缩小编码区间来表示不同的符号,最终得到较短的二进制码字。
五、熵编码方法的性能比较虽然霍夫曼编码和算术编码在熵编码中都有出色的表现,但它们在性能上有一些区别。
霍夫曼编码通常适用于固定长度的码字,适用于传输带宽有限的场景。
而算术编码则可以根据符号的概率分布生成变长的码字,更适合于传输带宽充足的场景。
六、熵编码在图像压缩中的应用熵编码方法在图像压缩中起到了至关重要的作用。
图像压缩的目标是减少图像数据的存储空间或传输带宽。
通过使用熵编码方法,可以将图像数据压缩至更小的体积,从而减少存储和传输的需求。
在图像编码中,熵编码方法常常与其他编码方法结合使用,如DCT变换和量化等。
七、总结通过熵编码方法,我们可以将图像数据转换为更小的二进制序列,以实现图像的压缩和传输。
图像编码是将原始图像数据转换为更紧凑的表示形式,用于存储或传输的过程。
动态编码技术是图像编码中一种重要的技术方法,它通过对图像数据进行分析和处理,以提高图像压缩效果和图像质量。
本文将介绍图像编码中的动态编码技术,包括熵编码、预测编码和变换编码。
一、熵编码熵编码是一种基于概率模型的编码方法,它根据图像的统计特性来对图像数据进行编码。
熵编码的目标是使用较短的编码表示来表示数据中出现频率较高的符号,而使用较长的编码表示来表示数据中出现频率较低的符号。
在图像编码中,熵编码主要用于对图像中的灰度值或颜色分量值进行编码。
最常用的熵编码方法是霍夫曼编码和算术编码。
霍夫曼编码通过构建霍夫曼树来实现编码。
它首先对图像数据进行统计,得到每个符号的概率分布,并根据概率构建霍夫曼树。
然后,根据霍夫曼树确定每个符号的编码表示,使得高频符号具有较短的编码,低频符号具有较长的编码。
最后,根据编码表对图像数据进行编码。
算术编码是一种基于概率的编码方法,它通过逐步逼近符号的概率来实现编码。
算术编码将整个图像作为一个整体进行编码,而不是像霍夫曼编码那样对每个符号进行编码。
它根据图像数据的连续性和统计特性来确定每个符号的编码表示,使得高频符号具有较短的编码,低频符号具有较长的编码。
二、预测编码预测编码是一种基于图像数据的空间相关性进行编码的方法。
它利用图像中相邻像素之间的相关性来实现编码。
预测编码通过预测当前像素的值,然后用真实值与预测值之间的差值表示编码结果。
在图像编码中,最常用的预测编码方法是差分编码和运动补偿编码。
差分编码是一种基于图像像素差值的编码方法,它利用相邻像素之间的差值来表示编码结果。
差分编码首先对图像进行预测,然后用预测值与真实值之间的差值进行编码。
差分编码适用于图像中像素值变化较小的情况,可以有效地减小编码结果的位数。
运动补偿编码是一种基于图像的运动信息进行编码的方法,它利用两幅连续图像之间的运动信息来表示编码结果。
x264的许多参数可以有-/--两种输入法,以下等价参数用“参数1/参数2 <必需数值格式>”表示-I/--keyint <整数> 最大IDR帧间距,默认250,也是GOP的最大值.-i/--min-keyint <整数> 最小IDR帧间距,默认25,也是GOP的最小值IDR-frame就是该帧的另一边没有可参照的帧。
IDR-Frame需要I-Frame,但是不是所有的I-Frame都是IDR-Frame。
大多数情况x264会把场景的第一个帧做为IDR-Frame。
GOP意思是画面组,一个GOP就是一组连续的画面。
在X264中GOP被定义为IDR帧之间的距离建议值:Blu-Ray设置为framerate的10被,其他设置为5~10倍。
min-keyintIDR-frame之间的最短长度。
建议及默认值:默认25,建议默认或者1xframerate。
--scenecut <整数> 画面动态变化限,当超出此值时插入I帧,默认40设定I/IDR帧放置的阀值。
x264会计算每个帧和前面帧的不同,如果不同值低于“scenecut”,那么就确定为是一个scenecut,如果同时又少于min-keyint帧数,那么就随后放置一个I-frame,否则会放置一个IDR-frame。
这个值越高,增加scenecut被侦测的几率。
默认值40-b/--bframes <整数> 在IP帧之间可插入的B帧数量最大值,范围0~16,默认3设定x264最多能同时使用多少个b-frame,如果没有b-frame,那么x264的帧类型如下:IPPPPP...PI,如果--bframe 2,那么就最多两个连续的P可以被替换为B,比如IBPBBPBPPPB..PIB-frame和P-frame的区别在于B可以对将来的帧使用动态预测(motion prediction)。
可以显著的提高压缩率。