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不断涌现,使得视频编码技术向着更高效、更开放的方向发展。从压缩效率、解码性能和应用场景等角度出发,各种编码格式有着不同的优势和应用前景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410897.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端面试真题整理

面试问题整理 本人主要记录2024年秋招、春招过程中的疑难八股真题,参考来源:牛客网、知乎等。 八股 深拷贝与浅拷贝 浅拷贝: 浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果…

黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤

文章目录 前言一、Ajax1. 概述2. 作用3. 同步异步4. 原生Ajax请求(了解即可)5. Axios(重点)5.1 基本使用5.2 Axios别名(简化书写) 二、前后端分离开发1. 介绍1.1 前后台混合开发1.2 前后台分离开发方式&…

linux下一切皆文件,如何理解?

linux下一切皆文件,不管你有没有学过linux,都应该听过这句话,就像java的一切皆对象一样。 今天就来看看它的真面目。 你记住了,只要一个竞争退出它的PCB要被释放文件名,客服表也要被释放。那么,指向这个文件…

使用代理和 Python 高效进行亚马逊数据抓取: 实用指南

文章目录 一、简介二、为什么要抓取亚马逊?三、了解代理3. 1. 搜索亚马逊的代理类型 四、为什么使用 Python?五、设置5. 1. 选择代理5. 2. 设置代理 六、抓取数据七、解析数据八、 结论 一、简介 在现代数字环境中,分析网络流量对于优化网站…

YOLOv10:实时端到端目标检测

摘要 https://arxiv.org/pdf/2405.14458 近年来,YOLO系列模型因其在计算成本与检测性能之间的有效平衡,在实时目标检测领域占据了主导地位。研究人员在YOLO的架构设计、优化目标、数据增强策略等方面进行了探索,并取得了显著进展。然而&…

RabbitMQ的基础概念介绍

MQ的三大特点:削峰、异步、解耦 1.RabblitMQ概念介绍 1.1概念 RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息…

【管理型文档】软件需求管理过程(原件)

软件需求管理规程应明确需求收集、分析、确认、变更控制及验证等流程,确保需求准确反映用户期望,支撑软件开发。该规程要求系统记录需求来源,通过评审确保需求完整、清晰、无歧义,实施变更控制以维护需求基线稳定,并持…

JVM类加载机制—类加载器和双亲委派机制详解

一、概述 上篇我们介绍了JVM类加载机制—JVM类加载过程,类加载过程是类加载机制第一阶段,这一阶段主要做将类的字节码(class文件)加载JVM内存模型中,并转换为JVM内部的数据结构(如java.lang.Class实例&…

软件测试——自动化测试selenium常用函数

目录 元素的定位cssSelectorxpath函数 操作测试对象窗口切换窗口窗口设置大小窗口切换屏幕截图关闭窗口 等待强制等待隐式等待显示等待 浏览器导航弹窗警告弹窗确认弹窗提示弹窗 文件上传浏览器参数设置 元素的定位 web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素&#xff0…

【操作系统】14.I/O设备怎么分配和回收?

5.2 I/O设备怎么分配和回收? 5.2.1 I/O核心子系统 I/O调度 设备保护 假脱机技术(SPOOLing技术) ​ 输入井和输出井 ​ 输入进程和输出进程 ​ 输入缓冲区和输出缓冲区 设备分配与回收 ​ 设备分配应考虑的因素 ​ 静态分配与动态分配 ​ 设备…

上传文件(用户导入),第二次选择文件时没有反应(可用)

https://gitee.com/y_project/RuoYi-Cloud/issues/I582YB PS:恰好我使用的版本是 支持 handleRemove ,所以很容易就解决了

企业如何选型人力资源管理系统?(附HR系统对比分析)

随着企业规模的扩大,人力资源管理系统成为了大中型企业不可或缺的工具。近年来,众多新技术产品层出不穷,这些技术和产品的实际功能和适用性并不明确,大量的新概念和新厂商通过各种渠道宣传,市场上信息过载使得企业难以…

美畅物联丨物联网平台的标准化之路:物模型设计的创新及应用

随着物联网(IoT)技术以前所未有的迅猛之势蓬勃发展,海量的物联网终端与应用纷纷接入,这不可避免地引发了数据与应用层面的异构化难题,进而形成了复杂且多变的碎片化问题。物联网感知数据因其具备多源异构的显著特性&am…

Linux中的常见命令——时间日期类命令

1、date显示当前时间 基本语法 写法功能描述date显示当前时间date %Y显示当前年份【四位数】date %m显示当前月份date %d显示当前是哪一天date "%Y-%m-%d %H:%M:%S" 显示年月日时分秒 【由于年月日和时分秒中间有空格所以需要用引号引起来】 实操案例 1、显示当…

【VUE入门级温故知新】一文向您详细介绍~组件属性Props(选项式API)

大家好,我是DX3906 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇 前面和大家分享了《如何从零开始创建一个 Vue 应用》 《VUE模板语法(超详细讲解)》 《一文向您详细介绍~Vu…

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

并发服务器---IO多路复用

单循环服务器&#xff1a;同一时刻只能处理一个客户端任务 并发服务器&#xff1a; 同一时刻&#xff0c;只能处理多个客户端的任务 实现方法&#xff1a;多进程 多线程 IO多路复用 IO多路复用&#xff1a; 1.阻塞io&#xff08;fgets scanf recv getchar read&#x…

算法的学习笔记—数据流中的中位数(牛客JZ41)

&#x1f600;前言 在处理动态数据时&#xff0c;实时计算中位数是一个经典问题。中位数是排序后处于中间位置的数值&#xff0c;数据流中的中位数计算面临两个挑战&#xff1a;首先是数据量的动态变化&#xff0c;其次是需要保持元素的有序性。为了高效地解决这个问题&#xf…

并发式服务器

并发式服务器是一种设计用来同时处理多个客户端请求的服务器。这种服务器能够提高资源利用率和响应速度&#xff0c;适用于需要服务大量用户的网络应用。以下是并发式服务器的一些关键特点&#xff1a; 多任务处理&#xff1a;并发式服务器能够同时处理多个任务或请求&#xff…

DDOS攻击学习-渗透测试-域名信息收集

文章目录 wordpress漏洞利用域名信息收集域名介绍域名分类 whoiswhois反查子域名收集子域名发现网络空间安全搜索引擎SSL证书查询js文件发现子域名 wordpress漏洞利用 这个一般都需要安装wordpress服务使用wpscan扫描&#xff0c;但现在一般很少人知道或者使用wordpress所以这个…