H264编码原理(一)压缩背后的秘密

2024-08-28 17:44

本文主要是介绍H264编码原理(一)压缩背后的秘密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

在当今的数字视频世界中,H.264编码技术无疑占据着至关重要的位置。虽然H.264编码原理可能听起来复杂又深奥,但只要深入了解视频的特性,就能明白为什么它需要如此设计。通过利用视频内容的冗余性和人眼的感知特性,H.264能够显著提高视频的压缩效率,同时保持较高的视觉质量。本文将带您一探究竟,揭示H.264编码技术的核心原理,并对其与其他前沿编码格式的对比进行详细阐述。

二、为什么视频需要编码

  • 原始未压缩视频:假设你有一段1080p(1920x1080)分辨率的原始未压缩视频,每秒30帧(30fps),每个像素24比特。

    • 数据量(每秒):30* 24 * 1920 * 1080 = 1.49 Gbps
  • H.264编码视频:可以将数据量压缩到原始数据量的1/50到1/100。

    • 压缩后数据量:15-30 Mbps

这只是1s的数据量,如果你用5G看视频,看一条短视频就会收到流量耗尽,手机已欠费的短信了。

三、为什么视频可以编码

视频编码的基础是利用数据的冗余性和人眼的感知特性,从而在不显著影响感知质量的前提下降低数据量。视频编码主要利用了以下几种冗余和感知特性:

3.1 空间冗余

基本原理:相邻像素之间通常具有很高的相关性。例如,在一个平滑过渡的天际背景中,相邻的像素通常都是相似的颜色和亮度。
在这里插入图片描述

比如大部分天空部分是均匀的蓝色。如果我们能够只记录一个蓝色值,然后加上少量的数据来说明这个颜色的扩展区域,就能显著减少数据量。

3.2 时间冗余

基本原理:视频帧序列中,有连续的帧表示同一场景或对象,仅有小部分变化。这意味着许多帧之间是高度相似的。

在这里插入图片描述

比如这个球,其中大部分帧中的背景几乎是静止的,只有球的位置发生了变化。利用时间冗余,我们只要记录这个球的位移就可以了

3.3 视觉冗余

基本原理:人眼对某些细节不敏感,比如高频细节(细小的纹理)和颜色变化的感知度不高。变换与量化步骤就利用了这些特性,舍弃或简化了这些人眼不敏感的细节,大幅降低数据量。

人眼其实是一台像素高达5.76亿的超级相机,这些数据如果都要送进我们的大脑里边去处理,那一会儿就会宕机了,所以人脑只会处理一些关键信息(低频信息),基于这个特性,在编码的过程中可以放弃一些高频信息,这样可以大幅降低数据量。

3.4 信息熵冗余

信息熵冗余是指在信息表达中,由于数据的概率分布不均匀或存在一定规律,导致实际携带的信息量小于理论上可能携带的最大信息量,从而产生的冗余。

举个简单的例子,一串文本aaaaaabb,需要8个字节来保存,a8b2,只要4个字节,而且还是无损的~

四. H.264编码过程概述

H.264编码过程充分利用了视频的特性,包括若干关键步骤:帧内预测、帧间预测、变换与量化、熵编码等。在此,我们将逐一介绍这些步骤,了解一个大概即可,我会在后面的文章中详细介绍每一步。

4.1 帧内预测 (Intra Prediction)

帧内预测指的是在编码当前图片时,仅依赖当前帧的已有数据进行预测。它利用的是空间冗余的特性,也就是相邻的像素块不会有太大的变化,只要记录差异值即可。

帧内预测也一样,它利用相邻像素(通常是左侧、上方和左上方)来预测当前块的值。

说预测可能会让你想到概率,其实和概率没关系。

在视频编码中的帧内预测,通常有 9 个预测方向,包括:垂直(Vertical)、水平(Horizontal)、左对角线(Diagonal Left)、右对角线(Diagonal Right)、垂直向右(Vertical-Right)、垂直向左(Vertical-Left)、水平向下(Horizontal-Down)、水平向上(Horizontal-Up)以及直流(DC,平均值预测)。

可以理解成9个算法,算出9个候选预测块,然后我们再用编码块减去每一个候选预测块得到一个个残差块。最后,我们取这些算法得到的残差块中像素的绝对值加起来最小的块为作为预测块。

4.2 帧间预测 (Inter Prediction)

在这里插入图片描述

帧间预测利用视频帧之间的相关性,通过参考前后帧中的块来预测当前帧中的块。这可以显著减少编码信息量。

关键步骤有两个,一个是遍历已编码的帧,找到和当前编码帧最相似的图像,另外一个是计算运动矢量(位移 + 方向)。

如何遍历在后面会具体分析,首先剧透一下不是用穷举法。

另外如果每个运动矢量都要记录,那也是一笔不小的开销,所以运动矢量的保存也借鉴了帧内预测的方法,记录运动矢量的残差值即可。

4.3 变换与量化 (Transform and Quantization)

量化是利用视觉冗余,应用离散余弦变换(DCT)将残差从空间域转换到频域。接着,对变换后的系数进行量化,以舍弃一些不重要的细节,从而进一步压缩数据量。

首先介绍一下高频信息和低频信息

低频信息

  • 代表图像中缓慢变化的部分,通常是图像的整体轮廓和大面积的平滑区域。
  • 反映了图像的主要结构和大致内容。
  • 包含图像中较为稳定和持久的特征。

高频信息

  • 对应图像中快速变化的部分,例如图像的边缘、纹理、细节和噪声。
  • 提供了图像的精细结构和局部变化的特征。

举例来说,对于一张清晰的人物照片,人物的大致轮廓和背景的整体色调属于低频信息;而人物的发丝、衣物的纹理、面部的细微表情变化等则属于高频信息。

DCT变换后,DCT系数能量主要集中在左上角,其他区域就会趋向于0。
在这里插入图片描述

其他区域通常会趋向于0,但很多时候不是0,

处理起来很简单,我们会把所有系数处以一个QP(Qstep)值,那大部分高频系数就变成0了,然后解码时再乘上QP值。

由此可见,DCT本身并不损失图像质量,QP越大,质量损失越大。

4.4 熵编码 (Entropy Coding)

最后,量化系数通过熵编码进一步压缩,利用霍夫曼编码或算术编码等算法,将较常见的符号分配较短的码字,而较不常见的符号分配较长的码字,从而提高编码效率。

H.264 中主要采用了两种熵编码方式:上下文自适应的可变长编码(CAVLC)和上下文自适应的二进制算术编码(CABAC)。这个后面也会介绍。

五、H264和其他编码方式的对比

特性H.264/AVCH.265/HEVCVP9AV1
标准发布时间2003年2013年2013年2018年
专利由MPEG-LA管理,需要许可费由MPEG-LA和HEVC Advance管理,需要许可费开源,未被专利池管理,Google开源开源,开放媒体联盟管理,不需许可费
压缩效率较高更高与H.264相近或稍高较H.265/HEVC更高,大约比H.265提升20%-30%
计算复杂性中等中等
公司支持广泛支持,标准化组织(ITU-T、ISO、IEC)广泛支持,标准化组织(ITU-T、ISO、IEC)Google、YouTube、Firefox、AndroidGoogle、Mozilla、苹果(部分)、Facebook、Netflix等
硬件支持广泛,几乎所有现代设备逐渐普及,但部分老旧设备不支持有限,多数需要软件解码较少,主要依赖于软件解码
编码速度较快较慢较快较慢
应用场景广泛用于蓝光光盘、视频流、实时通信、网络视频4K视频、超高清电视、流媒体、视频会议YouTube视频流、WebRTC流媒体、高清和超高清内容、低带宽传输
图像质量优秀非常优秀,支持更高分辨率优秀非常优秀,特别是低比特率下

六、总结

H.264编码通过一系列精确高效的步骤实现了视频数据的高效压缩。这些步骤包括帧内预测、帧间预测、变换与量化、熵编码等,每一个步骤都有其独特的意义和作用。通过利用空间冗余、时间冗余等特性,H.264能够显著减少视频数据量,并极大地提升视频传输和存储的效率。

尽管H.264是目前最广泛使用的视频编码标准,然而技术总在进步,新一代编码格式如H.265、VP9和AV1不断涌现,使得视频编码技术向着更高效、更开放的方向发展。从压缩效率、解码性能和应用场景等角度出发,各种编码格式有着不同的优势和应用前景。

这篇关于H264编码原理(一)压缩背后的秘密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115451

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu