深入学习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,一经查实,立即删除!

相关文章

【前端 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小的元素 题目六:二叉树的所有路径 题目一:计算布尔…

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

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

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

解析&#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 技术应用…

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

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

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

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

Arduino IDE界面和设置(基础知识)

Arduino IDE界面和设置&#xff08;基础知识&#xff09; 1-2 Arduino IDE界面和设置如何来正确选择Arduino开发板型号如何正确选择Arduino这个端口如何来保存一个Arduino程序Arduino ide 的界面功能按钮验证编译上传新建打开保存工作状态 1-2 Arduino IDE界面和设置 大家好这…

如何穿透模糊,还原图片真实面貌

目录 图像清晰化的魔法棒&#xff1a;AI如何穿透模糊&#xff0c;还原图片真实面貌 前言 论文背景 论文思路 模型介绍 复现过程 演示视频 使用方式 本文所涉及所有资源均在传知代码平台可获取。 图像清晰化的魔法棒&#xff1a;AI如何穿透模糊&#xff0c;还原图片真实面貌 在我…

全网最最实用--模型高效推理:量化基础

文章目录 一、量化基础--计算机中数的表示1. 原码&#xff08;Sign-Magnitude&#xff09;2. 反码&#xff08;Ones Complement&#xff09;3. 补码&#xff08;Twos Complement&#xff09;4. 浮点数&#xff08;Floating Point&#xff09;a.常用的浮点数标准--IEEE 754(FP32…

状态机 XState 使用

状态机 一般指的是有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;&#xff0c;又可以称为有限状态自动机&#xff08;Finite State Automation&#xff0c;FSA&#xff09;&#xff0c;简称状态机&#xff0c;它是一个数学模型&#xff0c;表示有限个…

【计算机网络】数据链路层实验

一&#xff1a;实验目的 1&#xff1a;学习WireShark软件的抓包操作&#xff0c;分析捕获的以太网的MAC帧结构。 2&#xff1a;学习网络中交换机互相连接、交换机连接计算机的拓扑结构&#xff0c;理解虚拟局域网&#xff08;WLAN&#xff09;的通信机制。 3&#xff1a;学习…

cas 和 synchronized 优化过程

cas 什么是CAS CAS:全称Compareandswap&#xff0c;字⾯意思:”⽐较并交换“&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B。 1. ⽐较A与V是否相等。&#xff08;⽐较&#xff09; 2. 如果⽐较…

ubuntu22.04单个网口两个IP

其中 4网段IP可用来上网&#xff0c;3 网段用来内网 界面显示: 配置文件&#xff1a; 01-network-manager-all.yaml 放在 /etc/netplan/ # Let NetworkManager manage all devices on this systemnetwork:version: 2renderer: networkdethernets:eth0:dhcp4: falsedhcp6: …