【H.264】五分钟入门H.264协议


<> 博客简介:Linux、rtos系统,arm、stm32等芯片,嵌入式高级工程师、面试官、架构师,日常技术干货、个人总结、职场经验分享

<> 公众号:嵌入式技术部落

<> 系列专栏:C/C++、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMake、Makefile、架构设计模式等

文章目录

  • 一、H.264 协议概述
      • H.264 协议介绍
      • H.264 协议目的
  • 二、H.264 协议解析
      • H.264码流
      • 视频编码层(Video Coding Layer, VCL)
      • 网络抽象层(Network Abstraction Layer, NAL)
      • 码流组织方式
        • AnnexB
          • 起始码(start code)
          • 防竞争字节 (Emulation Prevention Bytes)
        • AVCC
          • extradata
          • NALU Length
        • AVCC和AnnexB对比
      • NALU的作用
      • NALU的组成
        • NALU 主体
          • EBSP(Encapsulated Byte Sequence Payload,扩展字节序列载荷)
          • RBSP(Raw Byte Sequence Payload,原始字节序列载荷)
          • SODB(String of Data Bits,数据比特串)
        • NALU Header
          • forbidden_zero_bit
          • nal_ref_idc
          • nal_unit_type
        • 片(Slice)
        • 宏块(Macroblock)

一、H.264 协议概述

H.264 协议介绍

H.264,是一种视频压缩编码标准 ,同时也是MPEG-4第10部分规范(ISO/IEC 14496-10),MPEG-4 Part 10,⼜叫Advanced Video Codec(高级视频编码),因此H.264常常称为MPEG-4 AVC或直接叫AVC。所以在H.264的参数中可以看到 AVC == H264,而 HECV == H265。H.264已经成为高精度视频录制、压缩和发布的最常用格式之一。常见的写法H264,标准写法应该是H.264。

H.264 协议目的

H.264/AVC 协议的目的是为了创建一个更佳的视频压缩标准,在更低的比特率的情况下依然能够提供良好视频质量的标准(如,一半或者更少于MPEG-2,H.263,或者MPEG-4 Part2 )。同时,还要不会太大的增加设计的复杂性。H.264的另外一个目标是提供足够的灵活性,以允许该标准能够应用于各种各样的网络和系统的各应用上,包括低和高比特率,低和高分辨率视频,广播,DVD存储,RTP / IP分组网络和ITU-T多媒体电话系统。

二、H.264 协议解析

H.264码流

H.264码流是指按照H.264标准编码的视频数据流。H.264码流只存放了原始的视频数据,而不包含其他信息。例如,我们通常说的视频要包含音频,而H.264码流里就没有。除了音频之外,我们通常说的视频里还存放着其他辅助信息,比如视频的播放时长,每一帧的播放时间、帧率、画面是否旋转等等很多信息,而H.264码流里也没有。所以严格来说,H.264码流和我们通常意义上的“视频”还是有一定差距的。

H.264编码标准从码流功能的角度主要分为两个层次:视频编码层(Video Coding Layer, VCL)和 网络抽象层(Network Abstraction Layer, NAL) 。下图为H.264的分层结构图
在这里插入图片描述

视频编码层(Video Coding Layer, VCL)

视频编码层负责将原始视频数据进行编码,它定义了如何将原始视频数据压缩成更小的格式,VCL使用多种编码工具和技术来实现高效的压缩。

网络抽象层(Network Abstraction Layer, NAL)

网络抽象层负责将视频编码层产生的比特流组织成适合传输和存储的格式。它的主要任务是将编码数据打包成网络抽象层单元(Network Abstraction Layer Unit,NALU),这些单元可以在不同的网络和存储介质上进行传输和存储。

简单的说,视频编码层将原始视频数据压缩编码,网络抽象层将压缩编码后的数据打包成NALU(网络抽象层单元)来进行传输或存储。

码流组织方式

多个NALU在网络中传输或者写到一个文件里的时候,多个NALU首位相连成一串,因为NALU本身长度不一,也没有具体的标识符用来表明自己是一个独立的NALU,那么我们在从网络上接收到数据或者读取这个文件的时候,其实没有办法将在一起的NALU有效的进行区分。为了解决这个问题,我们必须在H264码流中将NALU进行分割,以便将在一起的NALU有效的进行区分,这种分割的方式就是H.264码流的组织方式。目前H264主流的码流组织方式有两种:AnnexB和AVCC两种格式。

AnnexB

AnnexB的格式比较简单,每个NALU之间通过分隔符0x00 00 00 01或者0x00 00 01区分不同的NALU。当我们读取一个 H264 流的时候,一旦遇到0x00 00 00 01或者 0x00 00 01,我们就认为一个新的 NALU 开始了。这些用来做分隔符的字节,一般被称为 start code, 起始码。
在这里插入图片描述

起始码(start code)

起始码有两种模式,四字节模式(0x00 00 00 01)和三字节模式(0x00 00 01)。一路H.264码流中NALU的起始码可能都是0x00 00 00 01,也可能都是0x00 00 01,同样也有可能既有0x00 00 00 01也有0x00 00 01。

但是只在 NALU 前面加上起始码还是会产生问题的,因为原始码流中,是有可能出现 0x00 00 00 01 或者 0x00 00 01 的,这样就会导致读取程序将一个 NALU 误分割成多个 NALU。为了防止这种情况发生,AnnexB 引入了防竞争字节(Emulation Prevention Bytes)的概念。
在这里插入图片描述

防竞争字节 (Emulation Prevention Bytes)

防竞争字节,就是在给 NALU 添加起始码之前,先对码流进行一次遍历,查找码流里面的存在的 0x00 00 00,0x00 00 01,0x00 00 02,0x00 00 03 的字节,然后对其进行如下修改

00 00 00 => 00 00 03 00
00 00 01 => 00 00 03 01
00 00 02 => 00 00 03 02
00 00 03 => 00 00 03 03

即在 00 00 之后,插入一个字节,内容是 03。经过这样处理的码流,就不会再和起始码(0x00 00 01, 0x00 00 00 01)重复而发生冲突。
在这里插入图片描述

当然,在解码过程中,通过起始码成功分割 NALU 数据之后,还要将防竞争字节去掉。

00 00 03 00 => 00 00 00
00 00 03 01 => 00 00 01
00 00 03 02 => 00 00 02
00 00 03 03 => 00 00 03
AVCC

AnnexB 的原理是在每个 NALU 前面写上一个特殊的起始码,通过这个起始码来当做 NALU 的分隔符,从而分割每个 NALU。
而 avcC 则采用了另外一种方式,那就是每一个NALU包都加上了一个指定NALU长度的前缀,前缀这几个字节(大端字节序)转成一个整数表示整个 NALU 的长度,我们不妨把这个前缀叫做 NALU Length。指定前缀字节数的值保存在一个头部对象中(流开始的部分),这个头通常称为 extradata 或者 sequence header 。

在读取的时候,先把这个extradata读出来,解析得到NALU Length的字节数,NALU Length这几个字节转成一个整数即为NALU Length的值,然后按照长度值读取整个 NALU。

它的基本格式如下:
在这里插入图片描述

extradata

在一路采用 avcC 打包的 H.264 流中,我们首先看到的将是 extradata 的数据,我们来看一下 extradata 数据格式

长度(bits)名称备注
8versionalways 0x01
8avc profilesps[0][1] 所存放第一个 SPS 的第一个字节
8avc compatibilitysps[0][2] 所存放第一个 SPS 的第二个字节
8avc levelsps[0][3] 所存放第一个 SPS 的第三个字节
6reserved保留字段
2NALULengthSizeMinusOneNALU Length 数据的长度减去 1,单位字节数
3reserved保留字段
5number of SPS NALUs有几个 SPS,一般情况下这里是 1
for(int i=0; i<number of SPS NALUs; i++){~
16  SPS sizeSPS 的长度
变长  SPS NALU dataSPS NALU 的数据
}~
8number of PPS NALUs有几个 PPS,一般情况下这里是 1
for(int i=0; i<number of PPS NALUs; i++){~
16  PPS sizePPS 的长度
变长  PPS NALU dataPPS NALU 的数据
}~

注: avcC 允许存多个 PPS 和 SPS。在 AnnexB 中,SPS 和 PPS 被当做了普通的 NALU 进行处理;而在 avcC 中,SPS 和 PPS 被当做特殊的信息进行了处理。

NALU Length

extradata中有一个变量NALULengthSizeMinusOne,这个变量告诉我们用几个字节来存储NALU的长度。我们注意一下上表中的这个值 NALULengthSizeMinusOne 这个字段长度是 2 个 bit,取值范围为0~3。NALULengthSizeMinusOne翻译一下为"NALU长度减1",单位是字节数,即 NALU Length 的字节数 - 1 = NALULengthSizeMinusOne ,通过将 NALULengthSizeMinusOne 加 1 ,我们就得出了后续每个 NALU 的 前缀 NALU Length 的字节数。

例如,这个 NALULengthSizeMinusOne 是 3,那么每个 NALU 的 NALU Length 长度就是 4 个字节。我们在读取后续数据时,可以先读 4 个字节,然后把这四个字节转成整数,就是这个 NALU 的长度了,注意,这个长度并不包含前缀 NALU Length的4个字节,是单纯 NALU 的长度。
在这里插入图片描述

AVCC和AnnexB对比

AnnexB格式:

1、AnnexB格式使用起始码(start code)作为NALU的分隔符。

2、AnnexB格式通常用于实时的流格式,比如说传输流、实时播放、通过无线传输的广播、DVD等。在这些格式中通常会周期性的重复SPS和PPS包,经常是在每一个关键帧之前。因此据此建立解码器可以一个随机访问的点,这样就可以加入一个正在进行的流,及播放一个已经在传输的流。

3、适合网络流。

AVCC格式:

1、AVCC格式在每个NALU之前包含了长度信息,可以直接根据长度信息来定位和提取NALU。

2、AVCC格式也叫AVC1格式,MPEG-4格式,常用于mp4/flv等封装中。AVCC格式的一个优点是在开始配置解码器的时候可以跳到流的中间播放,这种格式通常用于可以被随机访问的多媒体数据,如存储在硬盘的文件。解码器配置参数在一开始就配置好了,系统可以很容易的识别NALU的边界,不需要额外的起始码,减少了资源的浪费,同时可以在播放时调到视频的中间位置。这种格式通常被用于可以被随机访问的多媒体数据,如存储在硬盘的文件。MP4、MKV通常用AVCC格式来存储。

3、适合存储文件。

NALU的作用

NALU(Network Abstraction Layer Unit,网络抽象层单元)在H.264编码标准中起着至关重要的作用,是构建H.264码流的基本单元。NALU的主要作用和功能包括以下几个方面:

1、数据封装与传输
NALU将H.264编码后的视频数据进行封装,使其适用于各种网络传输环境。NALU为编码后的数据提供了一种标准化的格式,使得这些数据可以在不同的网络和设备之间传输。

2、 数据结构化
NALU帮助将视频数据结构化。H.264编码产生的原始视频数据通常会较大且复杂,NALU将这些数据分割成更小、更易管理的单元。

3、网络适应性
NAL头(NAL Header)中包含的参数使得视频数据能够适应不同的网络传输条件。例如,在一个丢包率较高的网络环境中,可以根据NAL头中的信息进行适当的错误恢复和数据纠错。

4、数据同步
NALU有助于在解码过程中进行数据同步。例如,特殊类型的NALU,如同步代码(SPS, Sequence Parameter Set)和图像参数集(PPS, Picture Parameter Set),提供了视频编码参数的信息,使得解码器能够正确地解码视频数据。

5、错误恢复
在网络传输中视频数据可能会丢失或损坏,NALU中的结构化信息和头部信息可以帮助接收端进行错误检测和恢复,提高传输的鲁棒性。

6、适应不同封装格式
H.264视频数据可以封装在不同的容器格式中,如MP4、MKV、FLV等。NALU提供了封装这些视频数据的基本单元,使得编码后的数据能够轻松地适应不同的封装格式。

通过使用NALU,H.264编码标准能够实现高效的视频数据压缩和灵活的网络传输,满足各种应用场景的需求。

NALU的组成

一个NALU = NALU Header + NALU 主体
在这里插入图片描述

NALU 主体

NALU的主体涉及到三个重要的名词,分别为EBSP、RBSP和SODB。其中EBSP完全等价于NALU主体,而且它们三个的结构关系为:EBSP包含RBSP,RBSP包含SODB。

EBSP(Encapsulated Byte Sequence Payload,扩展字节序列载荷)

在 H.264 的文档中,并没有 EBSP 这一名词出现,但是在 H.264 的官方参考软件 JM 里,却使用了 EBSP。NALU 的组成部分为:NALU = NALU Header + RBSP,其实严格来说,这个等式是不成立的,因为RBSP并不等于NALU刨去NALU Header。严格来说,NALU的组成部分应为:NALU = NALU Header + EBSP。
在这里插入图片描述

RBSP(Raw Byte Sequence Payload,原始字节序列载荷)

RBSP 是 H.264 标准中的概念,要说 RBSP,我们就要提到一个我们之前提到的概念,防竞争字节 (Emulation Prevention Bytes)。EBSP 相较于 RBSP,多了防竞争字节:0x03。

我们知道, H.264 在编码的时候,会加上 0x03 的字节来防止和 start code 产生冲突。而在读取到 NALU 之后,我们就要把编码时候加上的防竞争字节去掉。NALU 去掉 NALU Header 就是 EBSP,接着再去掉防竞争字节之后的数据,就叫做 RBSP。
在这里插入图片描述

SODB(String of Data Bits,数据比特串)

SODB是一种以比特为单位的数据表示形式。RBSP 相较于 SOBP,多了tariling bits。

一个SODB可以包含任意数量的比特,通常用于表示二进制数据流。视频在编码的时候,会将一比特一比特的数据写入到码流里面,而在写完之后,就有可能发生一种情况,就是写入的数据数量不满一个字节。
在这里插入图片描述
可以看到上图中数据共 19 bit,最后多出来 3 bit 的数据,不满一个字节,这在后续操作中会很不方便,所以在构建 RBSP 的时候,会将最后不满一个字节的情况进行补齐。

补齐的规则是先写入 1 bit 数据,数据内容是 1,然后开始补齐 0,直到补齐到一整个字节。
在这里插入图片描述
而在解码的时候,也要把补齐的部分去掉,RBSP 去掉补齐的数据后,就是 SODB。

这里其实还有另外一种情况,那就是你的码流在写入的时候,刚刚好写满了一整个字节,那么这种情况下拖尾内容要怎么处理呢?这种的拖尾系数,是新增加一个字节。新增加的字节第一位是 1,后面都是 0。
在这里插入图片描述
NALU、EBSP、RBSP和SODB的关系:
NALU - NALU Header = EBSP
EBSP - 防竞争字节 = RBSP
RBSP - 补齐的数据 = SODB
在这里插入图片描述

NALU Header

NALU Header占一个字节大小,NALU Header的结构如下:
在这里插入图片描述
我们可以看到,forbidden_zero_bit 占用 1 位,nal_ref_idc 占用 2 位,nal_unit_type 占用 5 位。三个元素一共占用 8 位,也就是一个字节。

forbidden_zero_bit

在网络传输中发生错误时,会被置为1,告诉接收方丢掉该单元,否则为0。

nal_ref_idc

用于表示当前NALU的重要性,值越大,越重要。解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。可能的值有 4 个,详情如下表。

nal_ref_idc重要性
3HIGHEST
2HIGH
1LOW
0DISPOSABLE
nal_unit_type

表示NALU数据的类型,有以下几种
在这里插入图片描述
1-4:I/P/B帧,它们是依据VLC的slice区分的。
5:IDR帧。立即解码刷新单元,可以独立解码和显示,即一种特殊的I帧I,告诉解码器,之前依赖的解码参数集合(接下来要出现的SPS\PPS等)可以被刷新了。
6:SEI,英文全称Supplemental Enhancement Information,翻译为“补充增强信息”,提供了向视频码流中加入额外信息的方法。
7:SPS,全称Sequence Paramater Set,翻译为“序列参数集”。SPS中保存了一组编码视频序列(Coded Video Sequence)的全局参数。因此该类型保存的是和编码序列相关的参数,比如profile level 分辨率和帧率等。
8: PPS,全称Picture Paramater Set,翻译为“图像参数集”。该类型保存了整体图像相关的参数,包含有关熵编码模式、分片组、运动预测和去块滤波器等信息。
9:AU分隔符,AU全称Access Unit,它是一个或者多个NALU的集合,代表了一个完整的帧。

片(Slice)

片是 H.264 提出的新概念,实际的原始视频图像数据保存在NALU的 VCL 层级中,这部分数据在码流中被称作是片(slice)。
片(slice)的概念不同与帧(frame),帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice)是通过编码图片后切分图片通过高效的方式整合出来的概念。
一个 slice 包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个 slice。在不同的编码实现中,同一帧图像中所构成的 slice 数目不一定相同。
一个 slice 编码之后被打包进一个 NALU,所以一个NALU包含一个slice。

一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice)。这属于编码阶段,由VCL实现。
在这里插入图片描述
而装载着这些片(slice)的载体,就是 NALU 了,我们可以来看看 NALU 跟片的关系(slice)。这部分由NAL实现。
在这里插入图片描述
上图中可以看出,片(slice)都是由 NALU 装载并进行网络传输的,但是这并不代表 NALU 内就一定是切片,这是充分不必要条件,因为 NALU 还有可能装载着其他用作描述视频的信息,比如前面提到的SPS、PPS。

片的主要作用是用作宏块(Macroblock)的载体。一个 slice 最少包含一个宏块,最多包含整帧图像的宏块。我们可以理解为一帧图像可以编码为一个或多个片(Slice),而每一个片(Slice)最少包含一个宏块,最多包含整帧图像的宏块。

片的主要目的是为限制误码的扩散和传输。如何限制误码的扩散和传输呢?每个片(slice)都应该是互相独立被传输的,某片的预测(片内预测和片间预测)不能以其它片中的宏块(Macroblock)为参考图像。

每个片也包含头和数据两部分:
1、片头中包含着片类型、片中的宏块类型、片帧的数量、片属于哪个图像以及对应的帧的设置和参数等信息。
2、片数据中则是宏块,这里就是我们要找的存储像素数据的地方。
在这里插入图片描述

宏块(Macroblock)

宏块是视频信息的主要承载者,因为它包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中的像素阵列。

组成部分:一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
在这里插入图片描述

从上图中,可以看到,宏块中包含了宏块类型、预测类型、Coded Block Pattern 编码的块模式、Quantization Parameter 量化参数、像素的亮度和色度数据集等等信息。

序列、图像、片、宏块、子宏块整体结构图:
在这里插入图片描述
上图中的一张图像即对应一帧。

写在后面
受限于时间,同时为了方便讲解,部分内容可能不是很严谨,如有错漏,敬请指出。如有问题,也欢迎随时交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

以现在的社会形势走向,选什么专业好?

随着高考结束&#xff0c;选专业的话题又开始变得越来越热门。因为很多学生都想知道自己更适合什么样的专业&#xff0c;如何结合未来的社会形势来选择更好的专业&#xff0c;这的确是一个很考验能力的问题&#xff0c;因为有太多人曾经为了选择专业而纠结过。 高考志愿填报选…

基于多源数据的密码攻防领域知识图谱构建

源自&#xff1a; 信息安全与通信保密杂志社 作者&#xff1a;曹增辉 , 郭渊博 , 黄慧敏 摘 要 提高网络空间安全的密码攻防能力&#xff0c;需要形成可表示、可共享、可分析的领域知识模式和知识库。利用自顶向下的构建方法&#xff0c;并通过本体构建方法梳理密码攻防领域…

Nginx 配置文件

Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件&#xff1a;include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错误日志记录 、配置文件解析 、事件驱动机…

Android Studio 2023版本切换DNK版本

选择自己需要的版本下载 根目录下的配置路劲注意切换 build.gradle文件下的ndkVersion也要配好对应版本

现代信息检索笔记(二)——布尔检索

目录 信息检索概述 IR vs数据库: 结构化vs 非结构化数据 结构化数据 非结构化数据 半结构化数据 传统信息检索VS现代信息检索 布尔检索 倒排索引 一个例子 建立词项&#xff08;可以是字、词、短语、一句话&#xff09;-文档的关联矩阵。 关联向量 检索效果的评价 …

使用Visual Studio Code记笔记

因为学习需要&#xff0c;记笔记是很有必要的&#xff0c;平常发CSDN&#xff08;都让CSDN是很棒的哈&#xff09;&#xff0c;后来使用VS Code的时候发现了很多插件&#xff0c;觉得做笔记还是相对不错的&#xff0c;主要用到的还是Markdown 主要设计的插件包括&#xff1a; …

第3章:数据结构

树 对稀疏矩阵的压缩方法有三种&#xff1a; 1、三元组顺序表 2、行逻辑连接的顺序表 3、十字链表 同义词才会占用同个位置&#xff0c;从而需要进行多次比较。这些关键字的第一个可以不是e的同义词&#xff0c;可以是排在e之前的关键字正好占了那个位置。 Dijkstra算法主要特点…

MySQL 高级SQL高级语句(二)

一.CREATE VIEW 视图 可以被当作是虚拟表或存储查询。 视图跟表格的不同是&#xff0c;表格中有实际储存数据记录&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了&#xff0c;而…

javassmmysql 宣和酒店点餐系统37378-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1研究背景 1.2目的 1.3ssm框架介绍 1.3论文结构与章节安排 2 宣和酒店点餐系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章…

Pascal 函数入门示例,及其汇编语言分析

1&#xff0c; Pascal 函数的定义格式 pascal 函数的定义语法格式: FUNCTION 函数名(形式参数表):函数类型; VAR 函数的变量说明; BEGIN 函数体; END; 2&#xff0c;Pascal 函数定义调用示例 order_self.pas 代码&#xff1a; PROGRAM example01;va…

黑龙江等保测评科普

黑龙江的等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是中国网络安全法框架下的一项重要制度&#xff0c;旨在提升信息系统安全水平&#xff0c;保护关键信息基础设施免受威胁。下面是对黑龙江等保测评流程和要求的科普&#xff1a; 1. 等保测评概念 定义&#xff…

Linux中定位JVM问题常用命令

查询Java进程ID #ps axu | grep java #ps elf | grep java查看机器负载及CPU信息 #top -p 1(进程ID) #top (查看所有进程)获取CPU飙升线程堆栈 1. top -c 找到CPU飙升进程ID&#xff1b; 2. top -Hbp 9702(替换成进程ID) 找到CPU飙升线程ID&#xff1b; 3. $ printf &quo…

操作系统精选题(三)(简答题、概念题)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、对 CPU、内存、外设并…

SpringCloud和Dubbo有什么区别

SpringCloud与Dubbo的区别 两者都是现在主流的微服务框架&#xff0c;但却存在不少差异&#xff1a; 初始定位不同&#xff1a; SpringCloud定位为微服务架构下的一站式解决方案&#xff1b;Dubbo 是 SOA 时代的产物&#xff0c;它的关注点主要在于服务的调用和治理 生态环境…

【linux】 给命令添加别名

【linux】 给命令添加别名 文章目录 【linux】 给命令添加别名1.修改2.效果 1.修改 2.效果

【AI大模型】跌倒监控与健康:技术实践及如何改变未来

文章目录 1. **背景与意义**2. **关键技术与方法**2.1 传感器数据融合2.2 深度学习模型2.3 行为模式识别2.4 预测与预防 3. **应用场景**3.1 老年人跌倒预警3.2 康复患者监测3.3 高风险职业防护 4. **实践案例**案例1&#xff1a;某老年社区的跌倒预警系统案例2&#xff1a;康复…

R语言数据分析案例39-合肥市AQI聚类和多元线性回归

一、研究背景 随着全球工业化和城市化的迅速发展&#xff0c;空气污染问题日益凸显&#xff0c;已成为影响人类健康和环境质量的重大挑战。空气污染不仅会引发呼吸系统、心血管系统等多种疾病&#xff0c;还会对生态系统造成不可逆转的损害。因此&#xff0c;空气质量的监测和…

android studio 添加aar包

按着以前旧的导包方式栽了大跟头&#xff0c;后面在留老板的的博客下找到了解决办法&#xff0c;记录一下。 Andriod Studio 导入aar最新的方式_gradle 8 引入arr-CSDN博客 最新导包方式 1.在新建libs目录&#xff0c;在app/libs目录下导入aar包&#xff08;其实就是拷贝过去…

ARP 原理详解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff0c;是根据 IP 地址获取物理地址的一个 TCP/IP 协议。 OSI 网络七层模型中&#xff0c;IP 地址在 OSI 模型第三层&#xff0c;MAC 地址在第二层&#xff0c;彼此不直接通信。 在通过以…

51单片机项目-点亮第一个LED灯(涉及:进制转换表、创建项目、生成HEX文件、下载程序到单片机、二极管区分正负极)

目录 新建项目选择型号添加新文件到该项目设置字体和utf-8编码二极管如何区分正负极原理&#xff1a;CPU通过寄存器来控制硬件电路 用P2寄存器的值控制第一个灯亮进制转换编译查看P2寄存器的地址生成HEX文件把代码下载到单片机中下载程序到单片机 新建项目 选择型号 stc是中国…