深入学习H264和H265

目录

前言

一 什么是H264/H265?

H.264 (MPEG-4 AVC)

H.265 (HEVC)

二 为什么要学习H264和H265?

1. 深入理解视频压缩原理

2. 硬件优化与集成

3. 调试与故障排除

4. 持续的技术更新

三 NAL(Network Abstraction Layer)详解

1. 为什么要学NALU呢?

2 那么一个NALU单元里面的构造有是什么样的呢?

3. type低5位代表怎么什么呢?

4. 一些经常见的Type字段

四 264中裸流IPB帧如何分布

1 什么是GOP


前言

在开始学习H264/H265之前,我们要先了解一些和视频相关的专业名词

  1. Level(级别)指定视频编码的最大能力,如最大分辨率、最大帧率等。
  2. NAL Unit(网络抽象层单元)视频编码流中的最小可访问单元,用于传输和解码。
  3. Slice(片)视频帧的一部分,可以独立解码,用于错误恢复和并行处理。
  4. Macroblock(宏块)编码的基本单元,通常为16x16像素的块,用于运动估计和预测。
  5. Intra Frame(I帧)不依赖其他帧进行解码的帧,通常用于随机访问点。
  6. Predictive Frame(P帧)可以向前参考一个或多个I帧或P帧进行解码。
  7. Bidirectional Frame(B帧)可以前向和后向参考进行解码,提供更高的压缩效率。
  8. SPS(Sequence Parameter Set)包含序列级别的参数,如画面尺寸、帧率等。
  9. PPS(Picture Parameter Set)包含图像级别的参数,如量化参数、熵编码模式等。
  10. SEI(Supplemental Enhancement Information)提供额外的信息,如时间戳、摄像机运动数据等。
  11. GOP(Group of Pictures)一系列连续的帧,通常包含一个I帧和随后的P帧或B帧。

一 什么是H264/H265?

H.264 (MPEG-4 AVC)

H.264,全称MPEG-4 Part 10或Advanced Video Coding (AVC),是由ITU-T的视频编码专家组(VCEG)和ISO/IEC的动态图像专家组(MPEG)联合开发的一种视频编码标准。H.264的主要目标是在与早期标准(如MPEG-2和MPEG-4 Part 2)相同的视频质量下,提供大约两倍的压缩效率。这意味着使用H.264编码的视频文件可以比使用旧标准编码的文件小一半左右,这对于网络传输和存储来说非常重要。

H.264通过多种技术实现高效压缩,包括:

  • 块运动补偿预测
  • 变换编码
  • 熵编码(如CABAC或CAVLC)

H.265 (HEVC)

H.265,又称为High Efficiency Video Coding (HEVC),是H.264的后继者,同样由VCEG和MPEG联合开发。H.265的目标是在H.264的基础上进一步提高压缩效率,理论上可以比H.264节省大约50%的比特率,同时保持相同的视频质量。

H.265相对于H.264的主要改进包括:

  • 更大的编码单元(CU)尺寸,从64×64到8×8像素的自适应四叉树结构。
  • 改进的运动预测和帧内预测技术。
  • 更高效的熵编码方法。
  • 更精细的量化参数控制。

这些改进使得H.265在处理高清和超高清视频时更加高效,但同时也意味着更高的计算复杂度,这可能影响到实时编码和解码的性能。

由于H.265的高效性,它在高清和4K视频的流媒体和存储领域变得越来越重要

小结:H264/H265都是视频压缩标准,265会比264更先进,安防领域,为了兼容性,一般也会保留264一起使用

二 为什么要学习H264和H265?

如果是安防领域的嵌入式软件工程师,不说能精通264,265这两编码格式,但起码要有一点的了解,这样在程序出问题后能更快的定位问题,解决问题

1. 深入理解视频压缩原理

  • 理论基础:了解H.264和H.265的编码框架、算法原理和关键技术,如帧内预测、帧间预测、变换编码、熵编码等,有助于开发人员从底层理解视频压缩的过程和机制。
  • 优化策略:掌握这些原理可以指导开发人员如何根据不同的应用场景和硬件限制选择最优的编码参数和策略,比如在实时监控中如何平衡压缩效率与延迟。

2. 硬件优化与集成

  • 硬件加速:许多现代嵌入式处理器集成了专门的硬件模块来加速H.264和H.265的编码和解码,了解这些标准有助于开发人员充分利用硬件加速功能,提高视频处理效率,减少CPU负载和功耗。
  • 软件优化:对于没有硬件加速的场景,开发人员可以通过优化软件编码库(如FFmpeg)的使用,来提高编码速度和效率。

3. 调试与故障排除

  • 错误定位:当视频流出现质量问题或系统性能不佳时,对H.264和H.265的理解有助于开发人员快速定位问题所在,比如是否是编码参数设置不当、硬件资源不足或是网络瓶颈造成的。
  • 性能调优:基于对标准的深入了解,开发人员可以进行更细致的性能调优,比如调整量化参数、编码速率控制策略等,以达到最佳的视频质量和系统性能平衡。

4. 持续的技术更新

  • 技术演进:随着视频监控技术的发展,新的编码标准(如H.266/VVC)和相关技术不断涌现,深入理解H.264和H.265为基础,可以帮助开发人员更容易地过渡到新技术,保持系统的先进性和竞争力。

三 NAL(Network Abstraction Layer)详解

1. 为什么要学NALU呢?

我看下面的264的裸流结构,起始H264就是一个起始码+一个NALU单元这样接替,所以想要更清楚了解到H264的裸流,我们必须要去了解NALU了

2 那么一个NALU单元里面的构造有是什么样的呢?

NAL单元(NAL Unit)是NAL层的基本数据单位,由一个头部(一个字节)和一个负载部分组成:

        1.头部:包含了控制信息,用于指示NAL单元的类型、重要性等级以及其他相关参数。头部结构如下:

        2.负载:包含了实际的编码数据,如图像数据、参数集数据等。负载数据的结构和内容取决于NAL单元的类型。

3. type低5位代表怎么什么呢?

Type:5位的类型指示,用于标识NALU的类型。

Type字段的低5位编码了以下NALU类型:

0:未指定

1:非IDR图片的编码切片(Coded slice of a non-IDR picture)

2:编码切片数据分区A(Coded slice data partition A)

3:编码切片数据分区B(Coded slice data partition B)

4:编码切片数据分区C(Coded slice data partition C)

5:IDR图片的编码切片(Coded slice of an IDR picture)

6:补充增强信息(Supplemental Enhancement Information, SEI)

7:序列参数集(Sequence Parameter Set, SPS)

8:图像参数集(Picture Parameter Set, PPS)

9:访问单元分隔符(Access unit delimiter)

10:序列结束(End of sequence)

11:流结束(End of stream)

12:填充数据(Filler data)

13:序列参数集扩展(Sequence parameter set extension)

14:前缀NAL单元(Prefix NAL unit)

15:子集序列参数集(Subset sequence parameter set)

16-23:保留用于扩展

通过解读Type字段,解码器能够知道接收到的NALU是否是视频数据的一部分、是序列参数集还是图像参数集,或者是其他类型的NALU,从而正确地处理和解码数据。

4. 一些经常见的Type字段

67 :SPS

68 :PPS

65 :IDR帧

61 :I/P/B帧

如何解析type类型

例1:0x67  0110  0111

这个为序列参数集,即SPS

但是要注意,这个不代表只有0x67才是SPS

比如0x27,0010 0111,这个也代表SPS,高三位代表着数据的主要性

低五位才是NAL的类型

例2 : 61并非确定某帧,而是I/P/B都可能,如果需要进一步确定,需要在进一步分析,这个后面再说

四 264中裸流IPB帧如何分布

下图就是正常裸流中IPB帧的关系,两个I帧的间距称为GOP,不过一般在安防领域不会有B帧,具体情况可以看这篇博客

在这个结构中:

  • I帧:是自包含的,不依赖于其他帧进行解码。它使用帧内预测技术进行编码,通常占用的比特数较多,但可以作为随机访问点,即解码器可以从I帧开始解码,而无需考虑之前的帧。
  • P帧:使用前向预测技术,依赖于前面的一个I帧或P帧进行解码。P帧的编码效率高于I帧,因为它利用了时间冗余。
  • B帧:使用双向预测技术,既可以从前一个P帧或I帧预测,也可以从后一个P帧预测,或者两者结合。B帧通常占用的比特数最少,但需要前后两个参考帧,因此在解码时必须等待所有参考帧到位。

1 什么是GOP

GOP的大小(即GOP中帧的数量)可以根据应用场景和编码策略进行调整。较小的GOP(例如,每12帧有一个I帧)可以提供更好的随机访问性能,但压缩效率较低,因为I帧占用的比特数较多。较大的GOP(例如,每60帧有一个I帧)可以提高压缩效率,但随机访问性能较差,因为解码器需要解码整个GOP才能找到下一个I帧。

分布策略

编码器通常会根据以下因素来决定I、P、B帧的分布:

  • 码率控制:为了维持平均比特率,编码器可能会在复杂场景中增加I帧和P帧的比例,而在简单场景中增加B帧的比例。
  • 随机访问需求:如果视频流需要支持随机跳转,编码器会增加I帧的频率。
  • 延迟要求:在实时应用中,减少B帧的数量可以降低解码延迟,因为B帧需要等待后续的P帧才能解码,所以IPC的裸流数据一般不含B帧,因为对实时性比较高

后面预计还会有几篇博客

1 代码实现解析SPS和PPS,读取文件帧率,宽高度,GOP,IPB帧

2 安防领域中为啥很少使用B帧,甚至不使用

3 下暴雨,或者画面变化过快,视频码率飙升,如何解决

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

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

相关文章

如何找到最快解析速度的DNS

如何找到最快解析速度的DNS DNS,即域名系统(Domain Name System),是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用记住能够被机器直接读取的IP数…

实现领域驱动设计(DDD)系列详解:领域模型的持久化

领域驱动设计主要通过限界上下文应对复杂度,它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动,且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同,就应该在领域建模阶段率先定义领域…

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

Modbus转BACnet/IP网关的技术实现与应用

引言 随着智能建筑和工业自动化的快速发展,不同通信协议之间的数据交换也变得日益重要。Modbus和BACnet/IP是两种广泛应用于自动化领域的通信协议,Modbus以其简单性和灵活性被广泛用于工业自动化,而BACnet/IP则在楼宇自动化系统中占据主导地…

“微软蓝屏”全球宕机,敲响基础软件自主可控警钟

上周五,“微软蓝屏”“感谢微软 喜提假期”等词条冲上热搜,全球百万打工人受此影响,共同见证这一历史性事件。据微软方面发布消息称,旗下Microsoft 365系列服务出现访问中断。随后在全球范围内,包括企业、政府、个人在…

在spyder中使用arcgis pro的包

历时2天终于搞定了 目标:在anconda中新建一个arcpyPro环境,配置arcgispro3.0中的arcpy 一、安装arcgispro3.0 如果安装完之后打开arcgispro3.0闪退,就去修改注册表(在另一台电脑安装arcgispro遇到过) 安装成功后可…

CSS(九)——CSS 轮廓(outline)

CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…

Pytorch笔记1

建议点赞收藏关注!持续更新至pytorch大部分内容更完。 整体框架如下 目录 gpu加速数据数据结构张量TensorVariable 预处理数据增强 模型构建模块组织复杂网络初始化网络参数定义网络层 损失函数创建损失函数设置损失函数超参数选择损失函数 优化器管理模型参数管理…

Golang | Leetcode Golang题解之第273题整数转换英文表示

题目: 题解: var (singles []string{"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}teens []string{&…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

反序列化-极客大挑战2019php【I have a cat!】

知道这个题考的是反序列化,那么我们第一反应该拿到他的源码。 根据这句话判断【因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯 不愧是我!!! 】说明有目录 我们直接使用dir开扫,发现有压…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

反射型与dom型的xss的区别【源码分析】

反射型 XSS 和 DOM 型 XSS 都属于跨站脚本攻击 (XSS) 的类型,它们的共同点是均能通过注入恶意脚本在用户浏览器中执行,不同点是dom型xss不经过服务器,而反射型是经过服务器的。但是,它们在攻击方式、执行过程和防御措施上有所不同…

【人工智能】AI绘画:科技与艺术交汇的新时代

文章目录 🍊AI绘画:开启艺术创作新纪元AI绘画技术发展:算法与艺术的完美交融AI绘画的工作原理与创意生成AI绘画的应用 AI绘画工具介绍 🍊AI绘画:开启艺术创作新纪元 人工智能正以前所未有的力量重塑我们的世界,而AI绘画作为这股科…

论文总结:A Survey on Evaluation of Large Language Models-鲁棒性相关内容

A Survey on Evaluation of Large Language Models 只取了鲁棒性相关的内容 LLMs:《A Survey on Evaluation of Large Language Models大型语言模型评估综述》理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性设 3.2.1 Robustness鲁棒性&#xf…

Flink 技术与应用(一)

Flink技术与应用(初级篇) 起源 Apache Flink 是一个开源的大数据处理框架,其起源可以追溯到一个名为 Stratosphere 的研究项目,旨在建立下一代大数据分析引擎,2010 年,从 Stratosphere 项目中分化出了 Fl…

【OpenCV C++20 学习笔记】图片处理基础

OpenCV C20 图片处理基础 VS 2022 C20 标准库导入的问题头文件包含以及命名空间声明main函数读取图片读取检查显式图片写入图片 完整代码bug VS 2022 C20 标准库导入的问题 VS还没有完全兼容C20。C20的import语句不一定能正确导入标准库,所以必须要新建一个头文件专…

WebGIS的地图渲染|SVG|Canvas|Canvas

说到地图,平时我们使用过百度地图、高德地图、腾讯地图等,如果涉及地图开发需求,也有很多选择,如前面提到的几个地图都会提供一套JS API,此外也有一些开源地图框架可以使用,如OpenLayers、Leaflet、Mapbox、…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建,即 vue create projectName 但是官方更推荐 vite 创建,即 npm create vuelatest,然后从项目名开始配置 总结:入口在 index.html,它会引入 main.ts,…

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能,保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…