h264编码流程分析

简介: h264编码流程分析

H.264/AVC作为新一代视频编解码标准,提供了以往视频算法没有的新特性。比如多帧参考,以更灵活的方式使用更多的重建帧作为参考帧。在某些情况下,可以使用最多32个参考帧(在以往标准中,P帧的参考帧数目为1,B帧的参考帧数目为2)。该特性对大多数场景序列都可以带来一定的码率降低,或者质量提高。对某些类型的场景序列,例如快速重复的闪光,反复的剪切或者背景遮挡的情况,它能很显著的降低编码的码率。


H.264/AVC视频编码标准的数据处理流程仍然是混合编码框架,即基于像素块的运动补偿、变换、量化和熵编码的处理模块。H.264/AVC算法的这些处理模块都做了技术改进,以提高编码效率。典型的视频编码框架如图6-2所示。


4c251b09e57f4e48bb64d7e1860a51cf.jpg


处理的图像帧分割成多个16×16的宏块,根据图像编码类型I帧、P帧或B帧等,决定是对图像数据本身处理还是对残差编码处理。图像数据本身即帧内编码I帧,利用图像的空间相关性,去除空间冗余。残差编码,首先利用运动估计技术,在一定范围的窗口内搜索相对最佳宏块,然后相减形成残差,同时记录当前宏块的运行向量MV。对图像数据或残差做DCT变换、量化。为了解码器解码时图像不产生偏移,还要做IDCT变换、反量化,重建形成参考帧。由于块处理造成“块效应”,为了提高参考图像的准确度、清晰度,可采用环路滤波提高图像清晰度。最后对量化后的系数、运动向量及其他信息做熵编码,形成最后的码流。

H.264/AVC将视频压缩系统分成了视频编码层VCL(Video Coding Layer)和网络提取层NAL(Network Abstract Layer)两层,其结构如图6-3所示。视频编码层VCL通过时域、空域预测和变换编码来完成对视频信息的压缩。而网络提取层NAL则将与网络相关的信息从视频压缩系统中抽象出来,使网络对于视频编码层是透明的,它主要负责对编码后的数据进行封装,以提高其鲁棒性、降低误码率。采用分层结构有利于压缩编码与网络传输之间的分离,使视频编码层可以移植到不异构的网络中,适应不同的网络传输。


67609215ab964618a36234b558b8381f.jpg


视频编码层VCL是H.264/AVC的核心技术,视频算法是混合编码技术框架,包括变换、量化、编码三步骤。不过每个过程有了新的技术,码流更小、图像效果更好。通过每个模块的小的技术改进,而带来了系统整体性能的提升。变换的数据根据I帧编码、P/B帧编码,采用帧内预测和帧间预测(运动估计ME)。宏块的类型除了传统的16×16方式外,还增加了多种类型,如16×8、8×16、8×8等,更贴近物体运动模型。变换采用可逆的整数变换,使解码过程无误差积累。熵编码采用上下文自适应的可变字长编码CAVLC、二进制算术编码CABAC,码流更低。另外由于DCT块处理的原因,图像有块效应,编码器采用了内部环路滤波去除块效应。这些技术都是以前视频编码标准所没有的,但是工作原理相同。H.264/AVC编码器的工作框图如图6-4所示。


7f8f80e6c49141939fafa406670161d8.jpg


1.帧内预测

对I帧的编码是通过利用空间相关性实现的。以前的视频标准只利用了一个宏块MB内部的相关性,而忽视了宏块之间的相关性,所以编码后的数据量较大。为了能进一步利用图像空间相关性,H.264/AVC引入了帧内预测以提高压缩效率。总体来说,帧内预测编码就是用周围邻近的像素值来预测当前的像素值,然后对预测误差进行编码。帧内预测是基于图像块,对于亮度分量(Luma),块的大小,可以在16×16和4×4之间选择,16×16块有4种预测模式(垂直Vertical,水平Horizontal,直流分量DC,平面Plane),4×4块有9种预测模式(直流分量DC,8个方向)。对于色度分量(Chroma),预测是对整个8×8块进行的,有4种预测模式(垂直Vertical,水平Horizontal,直流分量DC,平面Plane)。除了DC预测外,其他每种预测模式对应不同方向上的预测。

(1)16×16亮度预测模式

16×16亮度预测信号根据预测的方向不同有4种预测模式,其预测模式如图6-5所示。分别是垂直方向、水平方向、DC、平面模式。


c83eb6f26fea4461886206497d244e3f.jpg


2)4×4亮度预测模式


在4×4亮度预测模式中,H.264/AVC把16×16的宏块划分成16个4×4的子块,每个子块用与其相邻的上面和左面已经编码并重建后的像素点进行预测,如图6-6所示。


d14f0d70a7e04491a8f98c9b227df2a4.jpg


4×4亮度信号根据预测方向的不同共有9种不同的预测模式。其预测模式如图6-6所示。其中,垂直预测(模式0)、水平预测(模式1)、DC预测(模式2)总是被认为是有效的,即使在上边或左边像素值不存在的情况下,也可认为不存在的像素值为128填充,来进行预测。而其它模式则只有在其需要使用的像素值存在的情况下,才能进行预测。

(3)8×8色度预测模式

色度分量以8×8块为单位进行预测,它与16×16亮度预测模式类似。其中相同位置的两个色度块U/Cb和V/Cr具有相同的最佳预测模式。

2.帧间预测

帧间预测是利用先前编码帧的重建图像作为参考,对当前图像进行预测编码的一种方式。它把参考图像的抽样点通过运动矢量的补偿,作为当前图像抽样值的参考值。和以往标准相比,H.264/AVC帧间预测的区别在于块尺寸更丰富,采用了1/4精度运动矢量、多参考帧等方法。

(1)树状结构的运动补偿

帧间预测用于降低图像的时域相关性,通过采用多帧参考和更小运动预测区域等方法,对下一帧进行精确预测,从而减少传输的数据量。每个亮度宏块可以被划分为形状不等的区域。宏块及子宏块分割如图6-7所示。图中一个16×16的亮度宏块有4种:1个16×16或2个16×8或8个8×16或4个8×8。而8×8模式的每个子宏块可以进一步进行分割,也有4种:1个8×8,2个4×8,2个8×4,或4个4×4。


530d642045d34e21b7fe538b1cff5029.jpg


每个分割或子宏块都有一个独立的运动补偿。每个运动矢量都须被编码、传输,分割的选择也要将编码压缩到比特流中。对于较大的分割尺寸,运动矢量的选择和分割的选择只需少量的比特,但运动补偿残差较多。小尺寸的分割可以减少运动补偿后的残差,但是需要传输较多的运动矢量和分割的选择。因而,大尺寸分割适合于较平坦的区域,小尺寸分割适合较多细节区域。宏块的色度成分(Cr, Cb)为相应亮度的一半,采用和亮度相同的分割模式,只是尺寸减半。

(2)1/4精度运动矢量

H.264/AVC中的运动矢量对亮度信号采用1/4精度。当运动矢量指向整数抽样点位置时,预测值将直接从相应的参考图像中抽样获取。当运动矢量指向分数抽样点时,其分数位置的像素并不存在于参考图像中,需利用邻近的已编码点进行内插得到。内插像素的生成方法如上面的图6-8所示。


13f177ff4356467d9fcf7af7bbef6a99.jpg


3.整数变换DCT及量化

H.264/AVC中的宏块大小为16×16,对其中每个4×4大小的块进行4×4的整数DCT变换后,得到16个4×4的变换矩阵。为了进一步提高压缩效率,该协议还允许把每个4×4的变换矩阵中的直流分量DC,单独取出组成一个新的4×4矩阵,对此矩阵进行Hadamard变换。整数DCT避免了以往标准中的编解码不匹配问题,使得反变换不会出现失衡的问题。并且其运算只包含加减和移位,且将量化融合在其中,有效的降低了运算量。H.264/AVC编码中整数变换及量化过程如图6-9所示。宏块的数据传送顺序如图6-10所示,图中上方的-1、16、17为直流分量形成的4×4、2×2块。


d37ba514ba2c4d729ee730eb0324135a.jpg

acb8237ecef0478d8581f7b4cd30785b.jpg


4.熵编码

H.264/AVC协议对于图像数据或残差提供了两种熵编码的方式,分别为基于上下文自适应变长码CAVLC(Context-based Adaptive Variable Length Coding)和基于上下文自适应二进制算术编码CABAC(Context-based Adaptive Binary Arithmetic Coding);如果不是预测残差,而是运动向量等其他数据,H.264/AVC则采用Exp-Golomb码或CABAC编码,视编码器的设置而定。

(1)CAVLC

变长编码VLC的基本思想就是对出现频率大的符号使用较短的码字,而出现频率小的符号采用较长的码字,这样可以使得平均码长最小。CAVLC中,H.264/AVC采用若干VLC码表,不同的码表对应不同的概率模型。编码器能够根据上下文,在这些码表中自动地选择如周围块的非零系数或系数的绝对值大小。最大可能地与当前数据的概率模型匹配,从而实现了上下文自适应的功能。

(2)CABAC

算术编码是一种高效的熵编码方案,其每个符号所对应的码长被认为是分数。由于对每一个符号的编码都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号的概率特性,因而它能够更大程度地逼近信源的极限香浓熵,降低码率。为了绕开算术编码中无限精度小数的表示问题,对信源符号概率进行估计,现代的算术编码多以有限状态机的方式实现,H.264/AVC的CABAC便是一个例子,其他的例子还有JPEG2000。在CABAC中,每编码一个二进制符号,编码器就会自动调整对信源概率模型(用一个“状态”来表示)的估计,随后的二进制符号就在这个更新了的概率模型基础上进行编码。这样的编码器不需要信源统计特性的先验知识,而是在编码过程中自适应地进行估计。显然,与CAVLC编码中预先设定好若干概率模型的方法比较起来,CABAC有更大的灵活性,可以获得更好的编码性能——大约降低10%的码率。

5.去块效应环路滤波器

去除块效应滤波器(Deblocking Filter或Loop Filter),它的作用是,消除经反量化和反变换后,重建图像中由于预测误差产生的块效应,即块边缘处的像素值跳变,从而一来改善图像的主观质量,二来减少预测误差。H.264/AVC中的Deblocking Filter还能够根据图像内容做出判断,只对由于块效应产生的像素值跳变进行平滑,而对图像中物体边缘处的像素值不连续给予保留,以免造成边缘模糊。与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改善主观质量,也就是说该滤波器位于解码环中,而非解码环的输出外,因而它又称作环路滤波Loop Filter。需要注意的是,对于帧内预测,使用的是未经过滤波的重建图像。


6.多参考帧的帧间预测

以往的P帧编码是以前面重建的帧作

为参考,进行运动估计预测得到最佳匹配块。B帧编码同样是以前后重建帧为参考预测得到残差。H.264/AVC提供了多个参考帧的帧间预测模式,使估计到的宏块更贴近实际运动物体模型,运动向量表示更精确。但在选用多帧参考的同时,计算量巨增,在使用DSP硬件实现H.264/AVC时,多帧参考的帧间预测并不启用。

7.提供SP/SI帧支持

H.264/AVC在支持I/P/B帧编码方式的同时,增加支持SP/SI帧编码方式。以上三种与以前的标准相似,主要是参考图像不同,其余两种像条类型是SP(切换P)、SI(切换I),是新的类型,用于在不同位率编码码流之间进行有效切换。与SP帧:称作切换P帧,能在不同编码图像之间有效地切换。SI帧:称作切换I帧,允许SP帧的宏块完全匹配,达到随机读取数据进行解码和恢复错误的目的。

8.其他新特性

(1)编码器控制

视频编码的控制是编码器实现的核心问题。由于视频序列中的图像内容随着空间与时间的不同而变化很大,因此,需要为图像的不同部分选择不同的编码参数进行压缩编码,而编码控制的目的就是确定一组编码参数。H.264编码器采用基于Lagrangian优化算法的率失真优化模型实现视频编码的控制,其实现方法简单而且效率高。

(2)参数集

H.264引入了参数集的概念,每个参数集包含了相应的编码图像的信息。序列参数集SPS包含的是针对一连续编码视频序列的参数选择标识,如帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式等。图像参数集PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如熵编码模式选择标识、片组数目、初始量化参数和去除块滤波系数调整标识等。

以上是H.264/AVC相对以往视频编码标准的技术的主要改进之处,效果也最明显。H.264/AVC相对MPEG-2/4、H.263在相同码率下,图像质量PSNR提高3dB多。图6-11是标准视频测试序列Foreman.qcif的不同编码器的码率对PSRN的比较图。通过比较可以看出, H.264/AVC的码率Bit-rate在相同质量Quality(亮度Y的PSNR)下,可节省非常可观的码流。


1dc24ef1886542c3a8c0ac2238cf8c85.jpg


表6-1列出了无B帧时,相同图像质量PSNR条件下,平均节省码流百分比。分析可以看出H.264/AVC比MPEG-4 SP节省34%的码流,这极大的鼓舞了人们的大力研发投入。但是同时也应该看到,H.264/AVC获得优越性能的代价是计算复杂度增加。据估计,编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。


be1903a726754cfa8bae3c9b08c567d0.jpg


不过让研发工程师欣慰的是,芯片ASIC、可编程DSP、FPGA、CPU等实现平台的性能在日益提升,多核处理器也已出现,可编程的数字媒体处理器也已经出现,如TI的DM64x系列、ADI的BlackFin系列、Philips的PNX系列等,Intel的双核CPU并支持SSE4媒体处理指令。硬件性能的逐步提升,实时实现复杂的视频算法已成为可能。


相关文章
|
存储 编解码 缓存
H.264编码
H.264编码
427 0
|
编解码 缓存 数据安全/隐私保护
浅析 HLS 流媒体协议
【2月更文挑战第13天】浅析 HLS 流媒体协议
2188 5
浅析 HLS 流媒体协议
|
应用服务中间件 nginx
nginx优化:URI过长或request header过大导致400或414报错
当出现URI过长或请求头过大导致400或414报错时,可以通过以下方式对Nginx进行优化: 1. 调整client_max_body_size参数:该参数用于限制请求体的大小。默认情况下,Nginx的client_max_body_size参数设置为1M。如果请求体超过这个大小,Nginx会返回400错误。您可以根据实际需求适当增加这个值,例如设置为10M或更大。 ``` http { client_max_body_size 10M; } ``` 2. 调整large_client_header_buffers参数:该参数用于调整请求头缓冲区的大
8605 0
|
C语言
MQTT交叉编译(海思v300 arm-hisiv300-linux-):openssl、paho.mqtt.c、paho.mqtt.cpp
MQTT交叉编译(海思v300 arm-hisiv300-linux-):openssl、paho.mqtt.c、paho.mqtt.cpp
1543 0
MQTT交叉编译(海思v300 arm-hisiv300-linux-):openssl、paho.mqtt.c、paho.mqtt.cpp
|
编解码 算法
白话H.265/HEVC和H.264/AVC编码结构
写在前面 在信息化时代,视频技术和应用的发展,特别是高清(HD)、超高清(UHD)、多视点(MultiView)视频、VR/AR技术的兴起,海量的视频信息已如潮涌般深入到我们工作和生活的方方面面。随着5G通信技术逐渐铺开落地,移动端设备的传输数据量会进一步增加。
4113 0
|
Android开发 计算机视觉 C++
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
音视频编程对许多程序员来说是一片充满挑战的领域,但借助如OpenCV、LearnOpenGL、FFmpeg、OBS Studio及VLC media player等强大的开源工具,可以降低入门门槛。这些框架不仅覆盖了计算机视觉、图形渲染,还包括多媒体处理与直播技术,通过多种编程语言如Python、C++的应用,使得音视频开发更为便捷。例如,OpenCV支持跨平台的视觉应用开发,FFmpeg则擅长多媒体文件的处理与转换,而VLC media player则是验证音视频文件质量的有效工具。
807 0
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
|
传感器 人工智能 算法
AI计算机视觉笔记二十七:YOLOV8实现目标追踪
本文介绍了使用YOLOv8实现人员检测与追踪的方法。通过为每个人员分配唯一ID,实现持续追踪,并可统计人数,适用于小区或办公楼出入管理。首先解释了目标检测与追踪的区别,接着详细描述了使用匈牙利算法和卡尔曼滤波实现目标关联的过程。文章提供了基于IOU实现追踪的具体步骤,包括环境搭建、模型加载及追踪逻辑实现。通过示例代码展示了如何使用YOLOv8进行实时视频处理,并实现人员追踪功能。测试结果显示,该方法在实际场景中具有较好的应用潜力。
2548 4
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
661 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
743 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
FFmpeg开发笔记(二十二)FFmpeg中SAR与DAR的显示宽高比
《FFmpeg开发实战》书中指出,视频宽高处理需考虑采样宽高比(SAR),像素宽高比(PAR)和显示宽高比(DAR)。SAR对应AVCodecParameters的sample_aspect_ratio,PAR为width/height。当SAR的num与den不为1时,需计算DAR以正确显示视频。书中提供了转换公式和代码示例,通过SAR或DAR调整视频尺寸。在修正后的playsync2.c程序中,成功调整了meg.vob视频的比例,实现了正确的画面显示。
533 0
FFmpeg开发笔记(二十二)FFmpeg中SAR与DAR的显示宽高比