深入学习H264和H265

news2024/9/20 15:06:53

目录

前言

一 什么是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.coloradmin.cn/o/1952744.html

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

相关文章

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接:https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码:Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…

UE5.4内容示例(2)StaticMeshes - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此熟悉一遍UE5的功能 StaticMeshes案例 1.1 - 1.2 模型基础 模型有可移动、固定和静态的模式。可移动模式一般会加动画;固定模式&…

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类? 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

blender使用- 置换修改器

置换修改器 对于物体可以先做细分,然后添加置换修改器,添加贴图。再对贴图的参数进行修改,渲染想要的效果。 旋转模式下(按下s),z表示方向,0表示平整

MySQL查询执行(一):count执行慢

查询处理器 MySQL查询处理器是MySQL数据库服务器的组件,它负责执行SQL查询。查询处理器的主要任务是解析查询(把用户提交的SQL查询转换为可以被数据库引擎理解和执行的数据操作指令序列),生成查询计划,然后执行该计划。…

【C++】循环即热案例-猜数字

在 1~100 中选取一个随机数,玩家输入数字,判断输入的数字与这个随机数的大小并输出以作为提示,在猜对后提示猜测正确并退出游戏 (若想活得一个随机数需要用到一个 rand() 函数,例如题中要求则要写 rand()%1001 &#…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(Menu Bar)、多个工具栏(Tool Bars)、…

普乐蛙VR航天航空体验馆知识走廊VR体验带你登陆月球

VR航天航空设备是近年来随着虚拟现实(VR)技术的快速发展而兴起的一种新型设备,它结合了航天航空领域的专业知识与VR技术的沉浸式体验,为用户提供了前所未有的航天航空体验。以下是对VR航天航空设备的详细介绍: 一、设备…

时间复杂度与O(n)

文章目录 1 复杂度分析1.1 时间复杂度1.1.1 循环执行次数1.1.2 大O(n)表示法 1.2 空间复杂度 1 复杂度分析 1.1 时间复杂度 ​ 时间复杂度用来表示算法运行时间的长短,用来定性的描述程序的运行时间。要了解时间复杂度,我们需要先了解程序执行的次数。…

法律 | 法律人AI使用指南

原文:法律 | 法律人AI使用指南|法官|法院|文书|公司法_网易订阅 01 引言 过去半年多,我一直在尝试着用AI来辅助自己的各项法律工作,将AI融入自己的日常工作之中,并试图形成自身稳定的“法律AI”工作流。在此过程中,…

vuex学习day02-state状态、严格模式(strict)、mutations、辅助函数mapMutations、actions

4、state状态 (1)作用:提供共享数据 (2)步骤: 1)找到仓库,通过state提供共享数据 报错1?: 解决方式: 找到.eslintrc.js文件,添加一…

【React】项目的目录结构全面指南

文章目录 一、React 项目的基本目录结构1. node_modules2. public3. src4. App.js5. index.js6. .gitignore7. package.json8. README.md 二、React 项目的高级目录结构1. api2. hooks3. pages4. redux5. utils 三、最佳实践 在开发一个 React 项目时,良好的目录结构…

Flink笔记整理(五)

Flink笔记整理(五) 文章目录 Flink笔记整理(五)七、处理函数(最底层最常用最灵活)7.1基本处理函数(ProcessFunction)处理函数的功能和使用ProcessFunction解析 7.2按键分区处理函数&…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

鱼哥好书分享活动第27期:看完这篇《云原生安全》了解云原生环境安全攻防实战技巧!

鱼哥好书分享活动第27期:看完这篇《云原生安全》了解云原生安全攻防实战技巧! 主要内容:读者对象:本书目录:了解更多:赠书抽奖规则: 当前全球数字化的发展逐步进入深水区,云计算模式已经广泛应用…

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined,客户端运行是通过的但命令行运行会报错 修改端口也是一样报错,地址修改为127.0.0.1会报错connect ECONNREFUSED 127.0.0.1:8080 解决方法:不用localhost&…

视觉SLAM第一讲

第一讲-预备知识 SLAM是什么? SLAM(Simultaneous Localization and Mapping)是同时定位与地图构建。 它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己…

《Milvus Cloud向量数据库指南》——Milvus Cloud不同场景下的部署形态选型

不同场景下的部署形态选型 一般说选型肯定离不开阶段。用到向量数据库的应用基本有这么几个阶段: AI 应用的快速原型构建。比如你在做一个 AI 个人助手、一个小的搜索引擎原型、一个端到端的 RAG 原型,这类项目的迭代速度是很关键的,而且原型构建期不需要关心性能或者稳定性…

JVM 内存分析工具 Memory Analyzer Tool(MAT)入门(一)

一、打开 jvisualvm (VisualVM 是一款集成了 JDK 命令行工具和轻量级剖析功能的可视化工具。 设计用于开发和生产。) 打开 jvisualvm.exe 工具会出现如下一些监控指标 二、VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同&#x…

街道宣传信息工作通讯稿怎样向新闻媒体投稿?

在街道单位从事信息宣传工作的初期,我深刻体会到了这份工作的艰辛与挑战。面对繁重的投稿任务和严苛的审核机制,传统的邮箱投稿方式如同一座难以逾越的大山,横亘在我与成功之间。每一篇精心撰写的通讯稿,都承载着对单位工作的热情与期待,却在漫长的等待与频繁的退稿中逐渐消磨了…