【音视频处理】H264/H265详解,为什么H264更常用?

news/2025/2/19 8:11:46/

大家好,欢迎来到停止重构的频道。

本期我们介绍视频编码格式H264

H264是视频画面最常用的编码格式了,几乎所有的播放器都支持这个编码格式,当然浏览器也不例外。

我们按这样的顺序讨论H264 :

1、  编码格式的作用 

2、  I帧、P帧、B帧、GOP 

3、  不同使用场景需要关注的点 

4、  H264、H265的选择

编码格式的作用

在往期《音视频转码工作原理》中介绍过,一个视频文件实际上是分三层的:封装、编码、基础数据

封装的作用请看往期《封装格式》。

编码的作用是为了压缩数据 ,限制最终文件的大小。

以视频为例,视频是由一帧一帧图像组成的,一帧图像的大小是由基础数据格式决定的,视频的基础数据格式一般为色彩空间模型。

如分辨率为1920*1080,色彩空间模型为YUV420的话 ,那么一帧图像的大小为3MB左右。

如果视频长度为1分钟,每秒25帧的话,理论视频文件的大小为4GB左右。

但是一般视频文件是没有这么大的。因为视频在编码阶段会压缩数据,所以平常几分钟的高清视频也就几百兆。​

编码的过程是由编码格式决定的,每个编码格式对应不同的压缩/解压缩算法,每个编码格式也对应不同的编码器/解码器,如果播放器不支持某个编码格式的话是播放不出来的。

这里顺便一提,一般只有对视频文件大小产生影响的基础参数才会作用在编码阶段,如码率、最大码率等。编码阶段会按这些参数限制文件大小,但同时也可能会产生有损压缩,影响画面质量。

其他基础参数,如分辨率、帧率等,都不是编码阶段处理的,这需要转码程序对原始帧的基础数据进行操作。

如降低帧率的修改,需要转码程序重新计算视频帧的时间戳,并抛弃一些多余的帧数据,当然FFmpeg等框架都提供这些处理接口。

I帧、P帧、B帧、GOP

H264是最常用的视频编码格式,这里的视频指的是图像。H264并不能处理音频数据。

H264的压缩工作原理是比较典型的,它的压缩算法加入了运动补偿、运动补充等概念。

也就是对于相似度较高的一段区间,并不需要记录所有的数据,而是根据前一个图像或前后图像计算出当前图像,这样整个文件的数据将会减少。

具体的压缩算法是不需要搞清楚的,但需要清楚对应的H264特殊概念,I帧、P帧、B帧、GOP

I帧是能独立播放的一帧图像,数据量是最大的。

P帧需要根据前一个I帧或P帧计算所得,数据并不完整,数据量比I帧少,视频中大多数都是P帧。

B帧需要根据前一个和后一个I帧或P帧计算所得,数据最不完整,数据量是最少的。

GOP指的是一组完整的视频帧,如gop设置为25,那么编码器会让每25帧的第一帧必定为I帧 。如果帧率也是25帧,那每秒的第一帧就必定是I帧。

不同使用场景需要关注的点

知道H264这些概念有什么用呢?在某些场景,这些概念起到关键作用。

首先无论是什么场景,都需要关注码率、最大码率的设置

因为码率是影响数据量最直观的参数,它会限制最终数据量的大小,毕竟很多时候,存储空间、网络带宽都是需要考虑的。

码率、分辨率、帧率等相关参数的讲解和具体建议,请参考往期《视频参数》,这里不作展开。

接下来是在线播放的场景 ,I帧、B帧、P帧、GOP这些一般都是不需要特别关心的。 

但是如果出现未加载完视频跳转不太流畅等问题的话,则可能是视频的某两个I帧相隔特别远,为了防止这种问题,可以将GOP设置帧率的4-5,保证每4-5秒必有一个I帧。

在直播的场景下,这些概念则需要特别关注。I帧是独立的帧,B帧、P帧的播放实质上都需要依赖I帧,所以流媒体服务器需要设置缓存I帧,这样首屏花屏的问题会得到一定程度缓解。

但还是会出现局部花屏的问题,我们还需要设置GOP,GOP一般设置为帧率的1-2倍,保证每1-2秒必有I帧,这样的话,理论上只有在1-2秒这个间隙中开始拉流才会出现花屏问题。

但是1-2秒的帧大都是相似的,且有又设置了I帧缓存的话,则即使有局部花屏,很多时候也是感觉不出来的。​

直播流一般需要禁止生成B帧,虽然B帧数据量是最小的,但是由于它需要后一个帧数据才能计算出来,所以禁止B帧有利于直播的流畅。

H264、H265的选择

近些年,H265也是有一些热度的,相同的视频H265编码的文件会比H264编码的文件小很多,一些时候甚至接近50%。

所以理论上,在相同带宽的前提下,H265的在线视频、直播流会拥有更高的画质,相同画质的情况下,H265也能更节省带宽/流量。

但这是建立在编码、解码计算量为代价的,也就是说,播放H265视频,会比H264视频更消耗性能

这是H264、H265最大的区别,H265比H264拥有压缩率更高的压缩算法。但同时,也损耗更多的性能,H264、H265的选择,更多是根据实际场景下,容量、带宽对比用户、服务器性能,哪个更为重要的考量。

但比这些更重要的是,H265的普及度并没有想象中高,不是所有浏览器都支持H265的

所以即使基于种种考量选用了H265,但是客户端不支持的话,那也是行不通的。所以H264目前还是比较常用的,毕竟H264编码的视频哪里都能播放,H265则不一定。

总结

本期介绍了最常用的视频编码格式H264,当然,有比H264无损压缩度更高,或者比H264功能更丰富的编码格式,但是普及程度决定了H264更为常用。


http://www.ppmy.cn/news/101948.html

相关文章

【SpringBoot】一、SpringBoot概述以及其自动配置基本原理

SpringBoot SpringBoot现在分为两个技术栈,第一个是常规的使用servletAPI的Web编程方式,第二种是使用Reactive方式的响应式编程,Reactive Stack可以使用很少的内存来实现复杂的功能,提升性能并压缩成本,是一种很好的新…

武汉研究所分享

中船重工旗下有六个研究所,分别为701、719、712、722、717、709。此外,中国航天三江集团有限公司也是不错的选择。以下是各所简要介绍: 701所:总体所,专攻舰船设计,招收专业方向广泛。以船舶、机械、电力、…

js中async与await详解

引言 JavaScript 是一门基于事件驱动和异步编程的语言,而异步编程是 JavaScript 中最常用的编程方式之一。在异步编程中,我们通常使用回调函数或 Promise 对象来处理异步操作的结果。而在 ES2017 中,引入了 async 和 await 关键字&#xff0c…

G0第24章:GORM CRUD指南 、 Hook介绍

07 CRUD CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建、查询、更新和删除操作。 本文中的db变量为*gorm.DB对象,例如: import ("gorm.io/driver/mysql""gorm.io/gorm" )func main() {// 参考 …

Swift 中的 Actors 使用以及如何防止数据竞争

文章目录 前言Actors 的基本原理Actor 是引用类型,但与类相比仍然有所不同 为什么会出现数据竞争如何防止数据竞争使用 async/await 访问数据防止不必要的暂停非隔离(nonisolated)访问为什么在使用 Actors 时仍会出现数据竞争?总结 前言 Actors 是 Swif…

渲大师云主机按量付费功能上线!

云主机可以提供强大的计算和存储能力,通过使用云主机,政企办公、视觉设计、影视制作和深度学习领域的专业人士可以获得更大的灵活性、可扩展性和计算能力,提高工作效率和效果。 然而,当我们在选择和使用云主机时,需要…

SpringMvc源码分析

概述 用户的请求,是如何被 DispatcherServlet 处理的 先看图 从图中可以看到请求首先是被 DispatcherServlet 所处理,但是实际上,FrameworkServlet 先被触发 我们看下处理各种请求的方法 Overrideprotected final void doGet(HttpServletR…

可数集和不可数集

有限集和无限集 后继集 设 S S S是任一集合,称 S S ∪ { S } S^ S\cup \left\{ S\right\} SS∪{S}为 S S S的后继集 自然数集 自然数集 N \mathbb{N} N的归纳定义是: (1) ∅ ∈ N \empty \in \mathbb{N} ∅∈N &#xff08…