深入学习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.mzph.cn/web/49799.shtml

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

相关文章

【Git】日常使用

参考 Git分支管理 如何使用 Git 进行多人协作开发 01 拉取最新分支 git pull origin main 02 创建分支 git checkout -b dev 03 在dev分支上进行更改 git commit git push dev 04 GitHub网页上提pull request,merge到main 05 删除分支 删除本地的dev分支和对…

【前端 11】初探DOM

JavaScript 对象 - DOM 初探 在Web开发中,DOM(Document Object Model,文档对象模型)是一个至关重要的概念。它不仅仅是一个API,更是Web页面与JavaScript代码之间的桥梁,允许开发者通过编程的方式动态地访问…

Redis:快速键值存储的入门指南

一、什么是Redis? Redis,全称为Remote Dictionary Server,是一种开源的、高性能的键值(Key-Value)存储系统。与传统的关系型数据库不同,Redis将数据主要存储在内存中,因此能够提供极低延迟的数…

【Unity2D 2022:UI】TextMeshPro组件无法显示中文

在Unity中创建了一个预制体Card,上面挂载了一些Text Mesh Pro组件用来显示卡牌信息。但是在输入文字后,发现无法显示中文: 解决方法如下: 一、导入字体文件(ttf格式)和常用字字集(txt格式&…

Linux--Socket编程UDP

前文:Socket套接字编程 UDP协议特点 无连接:UDP在发送数据之前不需要建立连接,减少了开销和发送数据之前的时延。尽最大努力交付:UDP不保证可靠交付,主机不需要维持复杂的连接状态表。面向报文:UDP对应用层…

算法:[递归/搜索/回溯]二叉树的深搜

目录 题目一:计算布尔二叉树的值 题目二:求根节点到叶节点数字之和 题目三:二叉树剪枝 题目四:验证二叉搜索树 题目五:二叉搜索树中第k小的元素 题目六:二叉树的所有路径 题目一:计算布尔…

前端调接口拿到数据之后,复制文本

一、使用navigator.clipboard对获取的内容进行复制。 需要注意navigator.clipboard使用的条件是: 1.通过 HTTPS 协议访问的页面 2.本地开发服务器上的页面,即 URL 为 http://localhost。经测试http://127.0.0.1,这个是不能使用的。 3.直接…

【C语言】宏定义常量加 ; 的错误

我在使用宏定义常量定义二维数组的时候,编译器报错:应输入“]”,如下: 原因是宏定义不是C语言规定的语句,它的结尾不加 ; 。在上图的 int mine[EASY_ROWS][EASY_COLS]; 中,把 EASY_ROWS 替换为了 9;2; &…

【VUE3】vue3 面试知识点

1. Vue 3 相比 Vue 2 的主要改进 Composition API:引入了一套基于函数的 API,允许以更灵活和可复用的方式组织组件逻辑。性能提升:通过改进虚拟 DOM 的算法和底层架构,实现了更快的渲染速度和更低的内存使用率。TypeScript 支持&…

【秋招笔试题】小明的美食

解析&#xff1a;思维题。由于需要互不相同&#xff0c;每次操作取重复的值与最大值相加即可&#xff0c;这样即可保证相加后不会新增重复的值。因此统计重复值即可。 #include <iostream> #include <algorithm>using namespace std; const int maxn 1e5 5; int…

大模型算法面试题(十一)

本系列收纳各种大模型面试题及答案。 1、说一下目前主流或前沿的预训练模型&#xff0c;包括nlp&#xff08;百度ERNIE3.0&#xff0c;华为NEZHA&#xff0c;openAI gpt-3&#xff0c;nvidia MegatronLM&#xff0c;macrosoft T5&#xff09;和cv&#xff08;我只知道CLIP&…

wordpress主题Typecho仿百度响应式主题Xaink

wordpress主题Typecho仿百度响应式主题Xaink 新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用

内衣洗衣机和手洗哪个干净?推荐五款品质优良精品

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…

pytorch backbone

1 简介 在PyTorch深度学习中&#xff0c;预训练backbone&#xff08;骨干网络&#xff09;是一个常见的做法&#xff0c;特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集&#xff08;如ImageNet&#xff09;上预先训练好的卷积神经网络…

基于Flink SQL CDC的实时数据同步

基于Flink SQL CDC&#xff08;Change Data Capture&#xff09;的实时数据同步是一种高效的数据处理方案&#xff0c;它允许用户实时捕获数据库中的变更操作&#xff0c;并将这些变更以流的形式进行处理和同步到其他系统或数据库中。以下是关于基于Flink SQL CDC的实时数据同步…

Linux嵌入式学习——数据结构——队列

一、概念 1&#xff09;定义 是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表 队列 是一种 先进先出&#xff08;First In First Out&#xff09; 的线性表 线性表有顺序存储和链式存储&#xff0c;栈是线性表&#xff0c;所以有这两种存储方式 同样…

【在开发小程序的时候如何排查问题】

在开发小程序的时候如何排查问题 在最近开发小程序的时候&#xff0c;经常出现本地在浏览器中调试没有问题&#xff0c;但是一发布到预发环境就出现各种个样的问题 手机兼用性问题 有时候会出现苹果&#x1f34e;手机键盘弹出&#xff0c;导致ui界面高度出现异常边界问题&#…

使用PageHelper插件来分页查询

目录 一.什么是PageHelper&#xff1f; 二.PageHelper的实战操作&#xff1a; 1.导入PageHelper的相关依赖&#xff1a; 2.配置代码展示&#xff1a; 3.分页查询代码解析&#xff1a; 另外&#xff0c;肯定读者会好奇为什么能够自动动态拼接&#xff1f; 一.什么是PageH…

关于Static 误用问题,总是记不住

一、常规的 静态局部变量&#xff0c;静态成员变量和成员函数没啥疑问 二、全局变量问题。。。 * 如果在 C 文件中使用 static 修饰全局变量&#xff0c; * 它将限制变量的作用域在当前文件内。 * 这意味着其他文件无法直接访问或修改这个变量的值。 …