音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理

1 视频为什么需要进行编码压缩

◼ 一张为 720x480 的图像,用 YUV420P 的格式来表示,其大小为: 720*480*1.5 约等于
0.5MB 。
◼ 如果是 25 帧, 10 分钟的数据量 0.5M*10*60*25 = 7500MB -> 7GB 多
◼ 视频编码压缩的目的是降低视频数据大小,方便存储和传输

2 为什么压缩的原始数据一般采用YUV格式,而非GRB

历史原因:如果只有Y分量,就是黑白电视机呈现出来的图像,为了兼容电视机

体积减少:UV分量可以减少,但是并不能太影响观看体验,比如YUV420p,就是一组UV只占0.5个Y,因此YUV420p只有YUV444的一半大小。

3 视频压缩原理-数据冗余 了解

编码的目的是为了压缩,各种视频编码算法都是为了让视频体
积变得更小,减少对存储空间和传输带宽的占用。编码的核心
是去除冗余信息,通过以下几种冗余来达到压缩视频的目的:
3.1. 空间冗余 : 图像相邻像素之间有较强的相关性, 比如一帧
图像划分成多个 16x16 的块之后,相邻的块很多时候都有
比较明显的相似性。
3.2. 时间冗余: 视频序列的相邻前后帧图像之间内容相似,比
如帧率为 25fps 的视频中前后两帧图像相差只有 40ms,前
后两张图像的变化较小,相似性很高。
3.3 视觉冗余: 我们的眼睛对某些细节不敏感,对图像中高频
信息的敏感度小于低频信息的。可以去除图像中的一些高
频信息,人眼看起来跟不去除高频信息差别不大(有损压
缩)。
3.4. 编码冗余(信息熵冗余): 一幅图像中不同像素出现的概
率是不同的。对出现次数比较多的像素,用少的位数来编
码。对出现次数比较少的像素,用多的位数来编码,能够
减少编码的大小。比如哈夫曼编码。

4 图像帧的类型 (I帧、P帧和B帧)

I帧、P帧和B帧是视频压缩领域中的基础概念,用于提升视频压缩效率、视频质量和视频
恢复能力。
◼ I帧(关键帧或帧内帧)仅由帧内预测的宏块组成。
◼ P帧代表 预测帧 ,除帧内空域预测以外,它还可以通过时域预测来进行压缩。P帧通过
使用已经编码的帧进行运动估计。
◼ B帧可以参考在其前后出现的帧,B帧中的 B代表双向 (Bi-Directional)

5 GOP(一组图像,Group of Pictures)和GOP长度

◼ 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。
在视频编码序列中,GOP即Group of picture( 图像组 ),指两个IDR帧之间的距离。
◼ GOP 长度越大 ,视频 压缩效率越高 ,但 视频质量和视频流恢复能力也越差 ,反之亦
然。
◼ 直播,如果是一秒25帧,一般gop设置为25, 50(一般是帧率的倍数).
◼ 如果不是直播流,B帧一般设置2帧连续B帧,以降低码率。

5.1 GOP之Closed GOP和Open GOP

Closed GOP 和 Open GOP 常见于视频流中,并影响压缩效率、视频容错能力以及 ABR 流的切换能力。
◼ 顾名思义, Closed GOP 对 GOP 外部的帧是封闭的。一个属于 Closed GOP 的帧只能参考这个 GOP 之内 的帧。
◼ Open GOP 与 Closed GOP 相反, Open GOP 内部的帧可以参考其他 GOP 中的帧。

5.2 GOP间隔

GOP 越大,编码的 I 帧就会越少。相比而言, P 帧、 B 帧的压缩率更高,因此整个视频的
编码效率就会越高。但是 GOP 太大,也会导致 IDR 帧距离太大,点播场景时进行视频的
seek 操作就会不方便。

6 H264编码原理 了解

对于每一帧图像,是划分为一个个块进行编码,就是我们说的宏块。
宏块大小一般是 16x16 ( H264 、 VP8 ), 32x32 ( H265 、 VP9 ), 64x64 ( H265 、 VP9 、
AV1 ), 128x128 ( AV1 )

6.1 宏块扫描

◼ 对于一个 YUV 图像,可以把划分成一个个 16x16 的宏块(以 H264 为例), Y 、 U 、 V 分量的大 小分别是 16x16 、 8x8 、 8x8 。这里我们只对 Y 分量进行分析( U 、 V 分量同理)。假设 Y 分量这 16x16 个像素就是一个个数字,采用“之”字方式扫描每一个像素值,则可以得到一个“像素串”。
压缩的目的是使得编码器当前的字符出现连续相同的字符,
比如 1,1,1,1,1,1,1,1 ,我们可以描述为 8 个 1.
数字越小越容易用更少的 bit 做压缩,比如一连串数字很小 (比如 0 , 1 , 2 , 1 , 0 )的“像素串” ,因为 0 在二进制中只 占 1 个位, 2 只占 2 个位即可。

6.2 帧内预测

1. 帧内预测 就是在当前编码图像内部已经编码完成的块中找到与将要编码的块 相邻的块。一般就是即将编码块的左边块、上边块、左上角块和右上角块, 通过将这些块与编码块相邻的像素经过多种不同的算法得到多个不同的预测 块。
2. 然后我们再用编码块减去每一个预测块得到一个个残差块。最后,我们取这 些算法得到的残差块中像素的绝对值加起来最小的块为预测块。而得到这个 预测块的算法为帧内预测模式

6.3 残缺块

H.264 整数 DCT 公式推导及蝶形算法分析 - Mr.Rico - 博客园 (cnblogs.com)
https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616791.html

6.4 帧间预测

◼
同理,帧间预测也是一样的。我们在前面已经编码完成的图像中,循环遍历每一个 块,将它作为预测块,用当前的编码块与这个块做差值,得到残差块,取残差块中 像素值的绝对值加起来最小的块为预测块,预测块所在的已经编码的图像称为参考 帧。预测块在参考帧中的坐标值 (x0, y0) 与编码块在编码帧中的坐标值 (x1, y1) 的差 值 (x0 - x1, y0 - y1) 称之为运动矢量。
◼
而在参考帧中去寻找预测块的过程称之为运动搜索。事实上编码过程中真正的运动 搜索不是一个个块去遍历寻找的, 而是有快速的运动搜索算法的 。
◼
通过预测得到的 残差块的像素值 相比编码块的像素值,去除了大部分空间冗余信息 和时间冗余信息,这样得到的像素值更小。如果把这个残差块做扫描得到的像素串 送去做行程编码,是不是相比直接拿编码块的像素串去做编码更有可能得到更大的 压缩率?

6.5 DCT 变换和量化

◼ 我们的目标不只是将像素值变小,而是希望能出现连续的 0 像素
◼ 这就需要利用我们人眼的视觉敏感性的特点了。我们刚才说了人眼对高频信息不太敏 感。因为人眼看到的效果可能差别不大,所以我们可以 去除一些高频信息 。这个就是 接下来我们要讨论的 DCT 变换和量化。
6.5.1 DCT变换
6.5.2 量化步长
◼ 由于人眼对高频信息不太敏感,如果我们通过一种手段去除掉大部分高频信息,也就是将大部分
高频信息置为 0,但又不太影响人的观感,是不是就可以达到我们最初的目标,即可以得到有一
连串 0 的像素串?这就涉及到量化操作了。
◼ 我们让变换块的系数都 同时除以一个值,这个值我们称之为量化步长 ,也就是 QStep(QStep 是 编码器内部的概念,用户一般使用量化参数 QP 这个值, QP 和 QStep 得到的结果就是量化后的 系数。QStep 越大,得到量化后的系数就会越小。同时,相同的 QStep 值,高频系数值相比低频 系数值更小,量化后就更容易变成 0。这样一来,将大部分高频系数变成 0。如下图所示:
6.5.3 量化步长

◼ 解码的时候,需要将 QStep 乘以量化后的系数得到变换系数,很明显这个变换系数和原始没有量 化的变换系数是不一样的,这个就是常说的有损编码。
◼ 而到底损失多少呢? 其由 QStep 来控制,QStep 越大,损失就越大。QStep 跟 QP 一一对应。从 编码器应用角度来看,QP 值越大,损失就越大 ,从而画面的清晰度就会越低。同时,QP 值越大 系数被量化成 0 的概率就越大,这样编码之后码流大小就会越小,压缩就会越高。
6.5.4 量化步长表

6.6  编码原理总结

◼ 为了能够在最后熵编码的时候压缩率更高,对于送到熵编码(以行程编码为例)的“像 素串”,包含的0越多,越能提高压缩率。 为了达到这个目标:
◼ 先通过帧内预测或者帧间预测去除空间冗余和时间冗余,从而得到一个像素值相 比编码块小很多的残差块。
◼ 然后再通过 DCT 变换将低频和高频信息分离开来得到变换块,然后再对变换块的 系数做量化。
◼ 由于高频系数通常比较小,很容易量化为 0,同时人眼对高频信息不太敏感,这样 就得到了一串含有很多个 0,大多数情况下是一串含有连续 0 的“像素串”,并且人 的观感还不会太明显。这样,最后熵编码就能把图像压缩成比较小的数据,以此 达到视频压缩的目的。
◼ 这即是视频编码的原理。

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

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

相关文章

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…

blender 快捷键 常见问题

一、快捷键 平移视图:Shift 鼠标中键旋转视图:鼠标中键缩放视图:鼠标滚动框选放大模型:Shift B线框预览和材质预览切换:Shift Z 二、常见问题 问题:导入模型成功,但是场景中看不到。 解…

电路与数字逻辑期末复习重点整理!!

1.带无关项的卡诺图 2.置数法设计N进制电路 计数器:具有记忆输入脉冲个数功能的电路称为计数器。 按照各个触发器状态更新情况的不同可分为: 同步计数器:各触发器受同一时钟脉冲─输入计数脉冲控制,同步更新状态。异步计数器&a…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言: 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中, 服务器最近压力太大扛不住了,买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

堡垒机软件详细定义以及部分厂商汇总

随着大家对网络安全的重视,越来越多的企业开始采购堡垒机。堡垒机可以分为硬件堡垒机、软件堡垒机、软硬一体机。今天我们就来聊聊堡垒机软件详细定义以及部分厂商汇总。 堡垒机软件详细定义 堡垒机软件,又称为运维安全审计系统,其主要功能在…

顺序表--数据结构第一关

顺序表 数据结构概念 定义:数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上,数组是最简单的数据结构 顺序表的底层就是数组 为什么呢? 例子如下: int arr[100]{1,2,3,4,5}; //修改某一个数据:arr[…

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…

掌握 Kubernetes 伸缩:HPA vs VPA 全面解析

前言 在 Kubernetes 中,水平 Pod 自动伸缩 (Horizontal Pod Autoscaler, HPA) 和垂直 Pod 自动伸缩 (Vertical Pod Autoscaler, VPA) 是两种关键的自动伸缩机制。它们在功能和用途上有显著区别,适用于不同的场景。本文将详细解析 HPA 和 VPA 的工作原理…

IAR嵌入式开发解决方案已全面支持矽力杰SA32系列车规MCU

IAR嵌入式开发解决方案已全面支持矽力杰SA32BXX系列车规ASIL-B MCU以及即将推出的SA32DXX系列ASIL-D MCU,共同推动汽车高品质应用的开发 中国上海,2024年6月26日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR与矽力杰半导体(以下简称“…

【AI生成】卫星系统海上通信应用及优缺点分析

卫星系统在海上通信中扮演着至关重要的角色,它为船舶、海上平台、搜救行动以及海洋研究等提供了可靠的通信手段。 应用 海上通信应用 1. 船舶通信:卫星通信系统为远洋航行的船舶提供语音、数据和互联网服务,确保船舶与岸上保持联系&#xf…

游戏爱好者将《超级马里奥64》移植到GBA掌机

GBA虽然在当年拥有多款马里奥系列游戏,不过你一定没有想到,N64的《超级马里奥64》也能被移植到这个游戏掌机。近日,一位名为Joshua Barretto的开发者就完成了这一挑战。 大家都知道,《超级马里奥64》于1996年登陆任天堂64主机&am…

入职必备-mac下载安装maven

1、Maven 下载 1.1、官网下载安装包 官网下载链接 历史版本下载: Index of /dist/maven/maven-3/3.8.8/binaries 注意 .bash_profile 文件中的符号可能会影响配置 1.2、解压文件 2、Maven 环境配置 2.1、Java JDK 依赖 配置 maven 环境变量需要先配置好 JDK …

第一视角:获取VC账号,是成为亚马逊供应商的全面准备与必要条件

在当今全球化、数字化的商业环境中,亚马逊作为全球最大的电子商务平台,为众多企业提供了无限的商业机会。然而,想要成功在亚马逊上立足,成为其优质供应商,并非易事。其中,VC(Vendor Central)账号&#xff0…

头歌——机器学习——逻辑回归如何实现分类

第1关:逻辑回归如何实现分类 任务描述 本关任务:编写一个使用逻辑回归实现分类的程序 相关知识 为了完成本关任务,你需要掌握:1.逻辑回归基本原理。2.适用sklearn进行逻辑回归分类。 逻辑回归算法 一般来说逻辑回归用于处理…

低空经济再获新动能!沃飞长空完成新一轮数亿元融资

当下,作为中国"新质生产力"代表的低空经济正在成为新的发展“风口”,全国各地开足马力加速入场。 低空经济有多“火”?政策方面,据不完全统计,已有26个省份的政府工作报告对发展低空经济作出部署&#xff1…

如何做好新闻软文宣发媒体资源筛选?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 新闻软文宣发是指企业通过创造或利用新闻事件&#xff0c…

重生之我要学后端10--Web服务器类型及基础知识(持续更新)

Web服务器类型及其基础知识 一、简介二、Apache HTTP Server三、Nginx四、处理客户端请求的过程五、web服务器和应用服务器5.1Web服务器5.2应用服务器5.3它们之间的区别5.4实际使用5.5他们和我们的后端应用是什么关系 一、简介 不同类型的服务器软件有各自的特点和优势&#x…

使用k8s变更线上版本号

第一步,在镜像仓库中找到历史版本号 第二步,在rancher中在工作负载里 第三步,在rancher找到这个版本号,可以更改之前的版本号 这样就可以很方便的退回到之前的版本了

Django安装与启动

1、Django是什么? 基于python的Web开发框架,支持用户快速开发安全、可维护的网站 2、怎么安装? pip install Django4.2 3、如何启动? 不写ip和端口时候,默认启动http://127.0.0.1:8000/ python .\manage.py runse…

AI时代的量化金融:ChatGPT在交易中的应用与前景

文章目录 📑前言一、智能量化:开启金融新世界二、作者简介三、本书特色四、适读人群 在数字化、智能化的时代浪潮中,金融领域正经历着一场前所未有的变革。传统的金融分析方法逐渐被高效、精准的量化金融与算法交易所替代,而人工智…