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

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别