【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

news2025/9/16 2:04:00

文章目录

  • 一、Tag Body 数据块体结构 - Video Data 视频数据
    • 1、Vedio Data 视频数据 类型标识
    • 2、Vedio Data 视频数据 结构分析
    • 3、Composition Time Offset 字段涉及的时间计算
    • 4、AVC Packet Type 字段说明
      • ① AVC Sequence Header 类型
      • ② AVC NALU 类型
      • ③ AVC End of Sequence 类型
    • 5、AVC 数据类型 说明
    • 6、AVC 格式视频 Tag 解析流程
  • 二、AVC Sequence Header 类型 的 结构分析
    • 1、AVC Sequence Header 类型结构
    • 2、H.264 的主要 Profile
    • 3、H.264 的 Level
    • 4、AVC Sequence Header 类型数据 案例
  • 三、AVC NALU 类型 的 结构分析
    • 1、AVC NALU 类型结构
      • ① NALU Length 字段解析
      • ② NALU Header 字段解析
      • ③ NALU Payload 字段解析
    • 2、AVC NALU 类型 数据案例
  • 四、AVC End of Sequence 类型 的 结构分析
    • 1、AVC End of Sequence 类型结构
    • 2、AVC End of Sequence 类型数据值


FLV 文件 的总体结构 由 File Header 文件头、File Body 文件体 组成 ;

  • File Header 文件头 固定为 9 字节 ,
  • File Body 文件体 由 若干 " Previous Tag Size 前一个标签大小 + Tag 数据块 " 组成 ;
    • Tag 数据块 由 Tag Header 数据块头、Tag Body 数据块体 组成 ;
    • Tag Header 数据块头 由 固定 11 字节组成 ;
    • Tag Body 需要根据 三种不同的 Tag 类型 各自有不同的结构 , 如 :
      • 音频数据 Audio Data、
      • 视频数据 Video Data、
      • 元数据 Script Data ;

在博客 【FFmpeg】FLV 格式分析 ① ( File Header 文件头 | File Body 文件体 | Tag Header 数据块头结构 | Script Data 元数据结构 ) 中 , 讲解了 Script Data 元数据Tag Body 结构 ;

在博客 【FFmpeg】FLV 格式分析 ② ( Tag Body 数据块体结构 - Audio Data 音频数据 | AAC 序列头 AudioSpecificConfig 结构分析 ) 中 介绍了 音频数据 Audio Data 的 Tag Body 结构 ;

在本篇博客 中开始 介绍 <视频数据 Video Data 的 Tag Body 结构 ;





一、Tag Body 数据块体结构 - Video Data 视频数据




1、Vedio Data 视频数据 类型标识


Tag Header 数据块头 中 , Tag Type 字段值为 0x09 , 说明该 Tag 数据块 是 视频数据 ;

在这里插入图片描述

之后的 Tag Body 数据块体 就是 视频数据 Video Data 的格式 , 其数据的 字节结构 与 音频数据 Audio Data 和 元数据 Script Data 完全不同 , 下面开始讲解 Video Data 视频数据 的 结构 ;


2、Vedio Data 视频数据 结构分析


Tag Body 数据块体Vedio Data 视频数据 类型 , 包含两个部分 :

  • 第一字节 : 视频参数信息 , Frame Type 和 Codec ID (1 字节)

    • Frame Type (高 4 位): 表示帧类型。
      • 1: Keyframe(关键帧)
      • 2: Interframe(非关键帧)
      • 3: Disposable interframe(仅限 H.263 格式的非关键帧)
      • 4: Generated keyframe(保留)
      • 5: Video info/command frame(视频信息或命令帧)
    • Codec ID (低 4 位): 表示视频编码格式。
      • 1: JPEG(仅限序列图像)
      • 2: Sorenson H.263
      • 3: Screen video
      • 4: On2 VP6
      • 5: On2 VP6 with alpha channel
      • 6: Screen video version 2
      • 7: AVC(H.264)
  • 第二字节 :

    • AVC 格式 : 如果是 AVC 格式 , 则 第 2 字节是 AVC Packet Type 字段 , 第 3 ~ 5 字节是 Composition Time Offset 字段 , 从第 6 字节开始就是真实的视频数据 ;
    • 非 AVC 格式 : 如果不是 AVC 格式 , 则 从第 2 字节开始都是 真实视频数据 ;

字段名称长度描述
Frame Type 和 Codec ID1 字节高 4 位表示帧类型,低 4 位表示编码格式。
- Frame Type第 1 字节 高 4 位帧类型:
1 - Keyframe(关键帧)
2 - Interframe(非关键帧)
3 - Disposable interframe(H.263 特有)
5 - Video info/command frame (视频信息或命令帧)
- Codec ID第 1 字节 低 4 位编码格式:
1 - JPEG
2 - Sorenson H.263
3 - Screen video
4 - On2 VP6
5 - On2 VP6 with alpha
6 - Screen video v2
7 - AVC
AVC Packet Type1 字节仅适用于 AVC 格式
0 - AVC sequence header
1 - AVC NALU
2 - AVC end of sequence
Composition Time Offset3 字节仅适用于 AVC 格式
表示 显示时间戳 (PTS) 解码时间戳 (DTS) 的偏移量,单位 毫秒 ms。
Video Data可变长度实际的视频数据内容,格式 和 长度取决于 Codec ID。

之前的博客

  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )
  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | AVC 序列头格式解析 )

对 FLV 视频格式进行了简单分析 , 可参考上述两篇博客进行理解 ;


3、Composition Time Offset 字段涉及的时间计算


在 【FFmpeg】FLV 格式分析 ① ( File Header 文件头 | File Body 文件体 | Tag Header 数据块头结构 | Script Data 元数据结构 ) – 解码时间 DTS 与 显示时间 PTS 博客章节 中 , 介绍了

在 FLV 的 Tag 数据块的 Tag Header 中 , 存在 如下两个字段 ;

  • Timestamp 字段 : 数据块的 解码时间 dts 的 低 24 位 ;
  • Timestamp Extended 字段 : 数据块的 解码时间 dts 的 高 8 位 ;

上述计算出来的时间是 DTS 解码时间 , 单位是 毫秒 ;


在上述 Tag Body 的 视频数据 Vedio Data 中的 Composition Time Offset 字段 , 就是 显示时间戳 PTS解码时间戳 DTS 的偏移量 , 单位为 毫秒 ms ;

PTS 计算公式如下 :

PTS = DTS + CompositionTime

4、AVC Packet Type 字段说明


AVC 格式 全称 " Advanced Video Coding " , 高级视频编码 , 又称为 " H.264 " 或 " MPEG-4 AVC " 格式 ;

Vedio Data 视频数据 中 , 如果 第一字节的后 4 位表示的 Codec ID ( 编码格式 ) 字段 值为 7 , 说明这是 AVC 格式 ;

AVC 格式的视频数据 , 分为三种类型 , 具体类型由 AVC Packet Type 字段 设置 ;


AVC Packet Type 字段的取值及其含义如下 :

类型描述
0AVC Sequence Header包含 解码器 初始化信息 AVCDecoderConfigurationRecord , 如 : SPS 序列参数集 和 PPS 图像参数集
1AVC NALU存储实际的视频帧数据,基于 H.264 的 NALU(网络抽象层单元)。
2AVC End Of Sequence表示视频流的结束标志(可选,通常用于流式传输场景)。

① AVC Sequence Header 类型


包含 AVCDecoderConfigurationRecord 数据 , 通常在视频流的起始位置出现 ;

该类型数据 提供 解码器初始化所需的元信息 , 如 : SPS(序列参数集)和 PPS(图像参数集) ;

解码器 只有 解析该数据 后 , 才能 正确解码后续的 NALU 数据 ;


② AVC NALU 类型


AVC NALU 类型 数据 就是 实际的视频帧数据 , 以 NALU(Network Abstraction Layer Unit)为单位 ;

NALU 是 H.264 数据的核心单元 , 可以是 I 帧、P 帧、B 帧 或 其他类型的编码数据 ;

NALU 数据 的 解析和解码是 H.264 视频播放的核心过程 ;


③ AVC End of Sequence 类型


表示 视频流的结束标志 , 该类型的数据是可选的 , 主要用于明确视频流的终止位置 ;

该类型的数据 在实际的流媒体场景中较少使用 , 但可能出现在 文件流结束 场景中 ;


5、AVC 数据类型 说明


FLV 文件中的 Tag Body 数据块体 中的 Video Data 在使用 AVC 格式(H.264)时 , 视频数据(Video Data) 部分只能是以下三种之一 :

  • AVC Sequence Header 用于初始化 H.264 解码器 , 包含 AVCDecoderConfigurationRecord 数据 , 如 : SPS 和 PPS 等信息 ;
  • AVC NALU 包含实际的视频帧数据 , 包括 I 帧、P 帧、B 帧等类型的编码数据 ;
  • AVC End of Sequence 表示视频流的结束标志 ;

这三种类型由 AVC Packet Type 字段 明确标识 :

  • 0 表示 AVC Sequence Header 类型 ;
  • 1 表示 AVC NALU 类型 ;
  • 2 表示 AVC End of Sequence 类型 ;

每个 FLV 视频 中的 AVC 视频格式 的 Tag 数据块体 的 Video Data 中只能包含 一种类型 , 不可能同时包含 AVC Sequence Header 和 AVC NALU 两种数据 , 解码器根据 AVC Packet Type 来判断如何处理数据 ;


6、AVC 格式视频 Tag 解析流程


AVC 格式视频 Tag 解析流程 :

  • 视频开始时 : 首先解析 AVC Sequence Header , 用于初始化解码器 , 如果没有解析该数据 , 则后面的 NALU 数据无法正确解码 ;
  • 播放过程中 : 不断接收 AVC NALU 数据 , 解码并显示视频帧 ;
  • 视频结束时 ( 可选 ) : 接收到 AVC End of Sequence 类型数据 , 标志视频流结束 ;




二、AVC Sequence Header 类型 的 结构分析




1、AVC Sequence Header 类型结构


在 FLV 视频标签 Video Tag 中 , 如果 AVC Packet Type 的值为 0 , 表示这是 AVC Sequence Header 类型数据 , 该数据结构包含 AVCDecoderConfigurationRecord , 用于初始化解码器并提供必要的解码参数 ;

AVC Sequence Header 类型数据 用于初始化 H.264 解码器 , 使其可以正确解码后续的 AVC NALU 数据 , 其中 SPS 和 PPS 数据是解码 H.264 视频的关键部分 ;

以下是 AVC Sequence Header 的具体结构 :

字段名称长度描述
configurationVersion1 字节配置版本号,固定为 1
AVCProfileIndication1 字节H.264 的 Profile , 例如:
- 66: Baseline Profile
- 77: Main Profile
- 100: High Profile。
profileCompatibility1 字节与 Profile 的兼容性相关,通常与 SPS 中的 constraint_set_flags 一致。
AVCLevelIndication1 字节H.264 的 Level ,例如:
- 30: Level 3.0
- 31: Level 3.1
- 40: Level 4.0。
lengthSizeMinusOne1 字节表示 NALU 长度字段的字节数减 1
- 值为 0:NALU 长度字段为 1 字节
- 值为 3:NALU 长度字段为 4 字节(常见)。
numOfSequenceParameterSets1 字节SPS(序列参数集)的数量,通常为 1
sequenceParameterSetLength2 字节SPS 数据的长度(以字节为单位)。
sequenceParameterSetNALUnit可变长度实际的 SPS 数据内容。
numOfPictureParameterSets1 字节PPS(图片参数集)的数量,通常为 1
pictureParameterSetLength2 字节PPS 数据的长度(以字节为单位)。
pictureParameterSetNALUnit可变长度实际的 PPS 数据内容。

2、H.264 的主要 Profile


H.264 的 Profile 是视频编码标准中的一种配置 , 用于定义支持的功能集 , 以便在不同场景中优化编码效率和解码复杂性 ;

不同 Profile 支持的功能不同 , 针对性也不同 , 主要用来平衡视频质量、复杂性和解码器的要求 ;

Profile 名称用途特点
Baseline视频会议、移动设备等低复杂度场景- 不支持 B 帧(双向预测帧)。
- 支持 I 帧、P 帧。
- 支持基本的熵编码(CAVLC)。
Main标清电视、DVD、流媒体- 支持 B 帧和帧间预测。
- 支持 CAVLC 和 CABAC(更高效的熵编码)。
High高清电视、蓝光光盘- 增加支持 8×8 的帧内预测模式。
- 支持更高的色彩精度(8x8 的变换和量化)。
Extended流媒体传输(已经很少使用)- 支持数据丢失恢复。
- 支持 B 帧、SP 帧(切换帧)和 SI 帧(恢复帧)。
High 1010 位深度的高质量场景- 支持更高的色彩深度(10 位),适用于专业视频制作。
High 4:2:2广播电视和视频编辑场景- 支持 4:2:2 色彩子采样,适合广播和后期制作应用。
High 4:4:4高质量的专业视频场景- 支持 4:4:4 色彩子采样,保留全色彩精度,适用于高级视频编辑和特效制作。

3、H.264 的 Level


在 H.264 标准 的 Level 级别 用来描述 视频的分辨率、帧率和比特率限制的一组参数 , 旨在平衡编解码复杂度和设备性能 , Profile 决定了支持的编码功能 , 而 Level 决定了这些功能的具体性能限制 ;

  • 最大分辨率 : 定义视频的水平和垂直像素数上限 ;
  • 最大帧率 : 限制视频每秒显示的最大帧数 ;
  • 最大码率 : 定义了视频流允许的最大比特率,单位为 Mbps ;
Level最大分辨率 (像素)最大帧率 (fps)最大码率 (Mbps)用途
1.0176×144150.064视频会议、低分辨率移动设备。
1.1176×144300.192移动设备的视频应用。
1.2320×240300.384更高分辨率的移动设备应用。
1.3352×288300.768低分辨率流媒体应用。
2.0352×288302.0标清视频。
3.0720×5763010.0标清流媒体和存储视频。
3.11280×7203014.0高清 (720p) 视频传输。
3.21280×7206020.0高帧率 720p 视频传输。
4.01920×10803025.0高清 (1080p) 蓝光和流媒体。
4.11920×10806050.0高帧率 1080p 视频。
5.03840×216030135.0超高清视频 (4K)。
5.13840×216060240.0高帧率超高清视频 (4K)。
6.08192×432030600.0超高清视频 (8K)。
6.18192×432060960.0高帧率超高清视频 (8K)。

4、AVC Sequence Header 类型数据 案例


下面的十六进制数据 就是 AVC Sequence Header 类型数据 :

01 64 00 1F 03 01 00 17 67 64 00 1F AC D9 40 78 02 27 E5 C0 44 00 00 03 00 04 00 00 03 00 80 3C 60 CB 20 01 00 04 68 EE 3C B0

解析每个字段 :

  • configurationVersion : 01 , 版本号 , 固定值 ;
  • AVCProfileIndication : 64 , 设置 H.264 Profile 级别是 High Profile ;
  • profileCompatibility : 00 , 设置 与 H.264 的兼容性 ;
  • AVCLevelIndication : 1F , 设置 H.264 的 Level 3.1 ;
  • lengthSizeMinusOne : 03 , 4 字节 NALU 长度字段 ;
  • numOfSequenceParameterSets : 01 , SPS 数量 有 1 个 ;
  • sequenceParameterSetLength : 00 17 , SPS 数据的长度 是 23 字节 ;
  • sequenceParameterSetNALUnit : 67 64 00 1F AC D9 40 78 02 27 E5 C0 44 00 00 03 00 04 00 00 03 00 80 3C 60 CB 20 , 是 实际的 SPS 序列参数集 的 数据内容 ;
  • numOfPictureParameterSets : 01 , PPS 数量 是 1 个 ;
  • pictureParameterSetLength : 00 04 , PPS 数据的长度 4 字节 ;
  • pictureParameterSetNALUnit : 68 EE 3C B0 , 实际的 PPS 图片参数集 的 数据内容 ;

注释后的数据字段 :

01 			# 版本号 , 固定值 1
64 			# 设置 H.264 Profile 级别是 High Profile
00 			# 设置 与 H.264 的兼容性
1F 			# 设置 H.264 的 Level 3.1
03 			# 4 字节 NALU 长度字段
01 			# SPS 数量 有 1 个
00 17      	# SPS 数据的长度 是 23 字节
67 64 00 1F AC D9 40 78 02 27 E5 C0 44 00 00 03 00 04 00 00 03 00 80 3C 60 CB 20 	# 实际的 SPS 序列参数集 的 数据内容
01 			# PPS 数量 是 1 个
00 04 		# PPS 数据的长度 4 字节
68 EE 3C B0	# 实际的 PPS 图片参数集 的 数据内容




三、AVC NALU 类型 的 结构分析




1、AVC NALU 类型结构


在 FLV 文件中,如果 AVC Packet Type 为 1,表示当前数据块是 AVC NALU 类型 ;

AVC NALU 包含实际的视频帧数据 , 基于 H.264 标准的 NALU(Network Abstraction Layer Unit,网络抽象层单元) ;

字段名称长度描述
NALU Length1, 2, 或 4 字节表示 NALU 数据(Header + Payload)的长度,通常为大端序 (Big-Endian) 格式。
NALU Header1 字节包括以下三个部分:
- 1 bitforbidden_zero_bit:必须为 0,表示无语法错误。
- 2 bitsnal_ref_idc:NALU 优先级,值越大优先级越高。
- 5 bitsnal_unit_type:NALU 类型(例如:1 = 非 IDR 图像片段,5 = IDR 图像片段,7 = SPS,8 = PPS)。
NALU Payload可变长度实际的 NALU 数据部分,包含编码数据(如帧数据或参数集信息)。

① NALU Length 字段解析


NALU Length 字段 用于指示紧随其后的 NALU 数据的总长度 , 包括 NALU Header 和 NALU Payload 的长度 , 但不包括 NALU Length 字段本身的大小 ;

NALU Length 字段的长度 的 字节数 , 由 AVC Sequence Header 中的 lengthSizeMinusOne 字段 决定(1、2 或 4 字节);

  • 如果 lengthSizeMinusOne = 0 , NALU Length 是 1 字节 ;
  • 如果 lengthSizeMinusOne = 1 , NALU Length 是 2 字节 ;
  • 如果 lengthSizeMinusOne = 3 , NALU Length 是 4 字节 , 最常见 ;

② NALU Header 字段解析


字段名称长度描述
forbidden_zero_bit1 bit保留位,必须为 0,表示无语法错误。
nal_ref_idc2 bits表示该 NALU 的优先级,值越大优先级越高。
nal_unit_type5 bits表示 NALU 的类型(例如:
- 1:非 IDR 图像的片段
- 5:IDR 图像的片段)。
RBSP data可变长度实际的原始比特流数据(RBSP, Raw Byte Sequence Payload)。
  • forbidden_zero_bit 字段 : 始终为 0 , 如果不是 0 , 说明数据有错误 ;
  • nal_ref_idc 字段 : 决定了 NALU 的优先级 , 常用于帧的丢弃策略 ;
    • 00 为最低优先级
    • 11 为最高优先级
  • nal_unit_type 字段 : 决定 NALU 的具体类型 , 如 :
    • 1 : 非 IDR 图像片段(普通帧)
    • 5 : IDR 图像片段(关键帧)
    • 7 : 序列参数集(SPS)
    • 8 : 图像参数集(PPS)
  • RBSP data 字段 : 包含实际的编码数据 , 如帧的宏块信息或参数集数据 ;

③ NALU Payload 字段解析


NALU Payload 字段 包含实际的 H.264 编码数据 , 如 : 帧的宏块信息、编码后的视频数据、SPS / PPS 参数 ;

根据 nal_unit_type 的不同 , 数据的意义和内容也不同 ; 如 :

  • 1(Coded slice of a non-IDR picture) : P 帧 ;
  • 5(Coded slice of an IDR picture) : 关键帧(I 帧) ;
  • 7(Sequence Parameter Set, SPS) : 序列参数集 ;
  • 8(Picture Parameter Set, PPS) : 图片参数集 ;

2、AVC NALU 类型 数据案例


AVC NALU 类型 数据案例如下 :

00 00 00 1B 65 88 84 00 0A 11 B0 45 67 00 12 34 56 78 9A BC DE F0

解析上述数据 :

00 00 00 1B  # 27 , 表示 NALU 的长度为 27 字节 
65  		 # 二进制形式 : 01100101  
				# forbidden_zero_bit = 0  
				# nal_ref_idc = 11 (3, 表示最高优先级)  
				# nal_unit_type = 5 (IDR 帧,关键帧)  
88 84 00 0A 11 B0 45 67 00 12 34 56 78 9A BC DE F0 # 实际的视频帧数据




四、AVC End of Sequence 类型 的 结构分析




1、AVC End of Sequence 类型结构


在 FLV 视频标签 Video Tag 中 , 如果 AVC Packet Type 的值为 2 , 表示这是 AVC End of Sequence 类型数据 ;

该类型 数据 用于标记 H.264 视频流的结束位置 , 通知解码器不再有后续的 NALU 数据 ;

该字段是可选字段 , 通常在流媒体传输中很少见 ;


AVC End of Sequence 类型结构 :

字段名称数据类型长度 (字节)描述
AVC Packet Typeuint81指定AVC数据包的类型。0表示Sequence Header;1表示NALU;2表示End of Sequence。
Composition Timeint243表示帧的PTS和DTS之间的时间差,以毫秒为单位。仅在AVC Packet Type为1时有意义。
  • 值固定为 2 , 明确标识数据为 AVC End of Sequence 类型 ;
  • 长度为 3 字节 , 通常为 00 00 00 固定值 , 表示解码时间与显示时间的偏移为零 . 因为 End of Sequence 不涉及实际视频帧解码或显示 , Composition Time 通常固定为零 ;

AVC End of Sequence 类型 数据 无其他负载数据 , 不包含实际的 H.264 NALU 数据,仅用于标记视频流的终止 ;


2、AVC End of Sequence 类型数据值


AVC End of Sequence 类型数据值 : 下面的值是固定的 ;

02 00 00 00
  • 02 : AVC Packet Type 字段 , 表示 End of Sequence 类型数据 ;
  • 00 00 00 : 表示 Composition Time 字段 , 解码时间与显示时间无偏移 ;

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

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

相关文章

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具&#xff0c;它可以帮助用户快速、高效地构建 Docker 镜像&#xff0c;并支持多种平台的构建。使用 buildx&#xff0c;用户可以在单个命令中构建多种架构的镜像&#xff0c;例如 x86 和 ARM 架构&#xff0c;而无需手动操作多个…

Centos类型服务器等保测评整/etc/pam.d/system-auth

修改服务器配置文件/etc/pam.d/system-auth&#xff0c;但是&#xff0c;把一下配置放在password的配置第一行才会生效 执行命令&#xff1a;配置口令要求&#xff1a;大小写字母、数字、特殊字符组合、至少8位&#xff0c;包括强制设置root口令&#xff01; sed -i 14a pas…

精准捕捉,智能训练:数据手套在机器人灵巧手领域的应用探索

数据手套是一种内置多个高精度传感器&#xff0c;能够精准捕捉手部动作数据&#xff0c;并将其转化为数字信号的高科技穿戴设备。 MHand pro动捕数据手套其内置16个高精度传感器&#xff0c;能敏锐感知手指的弯曲、伸展等动作。这些传感器通过复杂的算法&#xff0c;将手部动作…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;关于视频180度实时旋转&#xff0c;请见本专栏前面的文章&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中…

PHP如何封装项目框架达到高可用、高性能、高并发

很多初创公司为了快速上线业务&#xff0c;开发时间由本来的6个月压缩到3个月甚至2个月。开发人员只能根据时间及业务需求去git上找现有的项目二次开发或者是一个空框架根据业务一点一点的去做&#xff0c;上述两种方案虽然也可以上线但是对于业务本身存在的问题也是很大的&…

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式&#xff1f;2、观察者模式优缺点及注意事项&#xff1f;3、观察者模式实现&#xff1f;4、手写线程安全的观察者模式&#xff1f; 1、什么是观察者模式&#xff1f; - 实例&#xff1a;现实生活中很多事物都是依赖存在的&#x…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值&#xff0c;n通过键盘输入 思路 递进阶段&#xff1a;n、...... 、9、7、5、3、1 函数出口&#xff1a;递进到1 开始返回&#xff1b;函数返回值视为“总和” 回归阶段&#xff1a;对当前n取倒数&#xff1b;“总…

【数据结构进阶】红黑树超详解 + 实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、红黑树介绍 二、红黑树原理详解 三、红黑树的实现 1. 节点定义 2. 红黑树类型定义及接口声明 3. 红黑树的插入&#xff08;重点&a…

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…

H3C-无线WLAN配置案例(二层隧道转发)

目录 1.无线wlan产生背景:2.网络拓扑:3.网络简述:4.网络配置:4.1 网络基础配置4.2 无线wlan二层隧道转发配置4.3 无线wlan验证: 1.无线wlan产生背景: 无线WLAN&#xff08;无线局域网&#xff09;的产生背景主要源于以下几个方面的需求和技术发展&#xff1a;移动性和便捷性需…

Unreal Engine 5 C++ Advanced Action RPG 十一章笔记

第十一章 In Game Widgets 本章节就是做UI2-Template Button Widget 这章节创建不同的UI 结束UI胜利UI暂停菜单主菜单加载UI新建一个按钮小组件作为模版 3-Pause Menu Template Button 继续做更多模版UI 4-Lose Screen(游戏失败UI) 做失败的UI 之前按钮模版的调度程序就在这起…

C语言初阶牛客网刷题——HJ100 等差数列【难度:简单】-20250123

1. 题目描述——HJ100 等差数列 牛客网OJ题链接—HJ100等差数列 等差数列 2&#xff0c;5&#xff0c;8&#xff0c;11&#xff0c;14&#xff0c; … 。&#xff08;从 2 开始的 3 为公差的等差数列&#xff09;&#xff0c;求等差数列前 n 项和。 注意&#xff1a;本题有多…

订单状态定时处理、来单提醒和客户催单(day10)

Spring Task 介绍 Spring Task 是 Spring 框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a; 定时任务框架 作用&#xff1a; 定时自动执行某段Java代码 为什么要在 Java 程序中使用 Spring Task&#xff1f; 应用场景&#xff1…

ES6 简单练习笔记--变量申明

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…

机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)

朴素贝叶斯模型 贝叶斯定理&#xff1a; 常见类型 算法流程 优缺点 集成学习算法 基本原理 常见方法 KNN&#xff08;聚类模型&#xff09; 算法性质&#xff1a; 核心原理&#xff1a; 算法流程 优缺点 matlab中的运用 朴素贝叶斯模型 朴素贝叶斯模型是基于贝叶斯…

【赵渝强老师】K8s中Pod探针的HTTPGetAction

在K8s集群中&#xff0c;当Pod处于运行状态时&#xff0c;kubelet通过使用探针&#xff08;Probe&#xff09;对容器的健康状态执行检查和诊断。K8s支持三种不同类型的探针&#xff0c;分别是&#xff1a;livenessProbe&#xff08;存活探针&#xff09;、readinessProbe&#…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

bat批处理删除此电脑左侧及另存为下文档视屏等多余项

发现的一个解决强迫症人士痛点的小方法&#xff0c;自整理为一键批处理&#xff0c;需者自取 他可以一键去掉电脑左侧及另存为下文档视屏等多余项&#xff0c;还界面一个清爽整洁 干干净净&#xff0c;舒服 分享的是bat文件&#xff0c;可以右键编辑查看源代码&#xff0c;绝…