当前位置: 首页 > news >正文

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

文章目录

  • 一、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 字段 , 解码时间与显示时间无偏移 ;

相关文章:

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

文章目录 一、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 …...

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛...

MinIO的安装与使用

目录 1、安装MinIO 1.1 下载 MinIO 可执行文件 1.2 检查 MinIO 是否安装成功 1.3 设置数据存储目录 1.4 配置环境变量&#xff08;可选&#xff09; 1.5 编写启动的脚本 1.6 开放端口 1.7 访问 2、项目实战 2.1 引入依赖 2.2 配置yml文件 2.3 编写Minio配置类 2.4…...

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Spring Boot/MVC

一、Spring Boot的创建 1.Spring Boot简化Spring程序的开发,使用注解和配置的方式开发 springboot内置了tomact服务器 tomact:web服务器,默认端口号8080,所以访问程序使用8080 src/main/java:Java源代码 src/main/resource:静态资源或配置文件,存放前端代码(js,css,html) s…...

uni-app连接EventSource

前言 uniapp默认是不支持event-source&#xff0c;这里是借助renderjs进行SSE连接 正文 引入event-source-polyfill 这里演示的是直接将代码下载到本地进行引入 下载地址 把里面的eventsource.min.js文件放到项目中的static文件夹 项目封装event-source.vue组件 <templ…...

[SCTF2019]babyre

[SCTF2019]babyre 一、查壳 无壳&#xff0c;64位 二、IDA分析 1.没有main&#xff0c;那就shifef12 点击&#xff1a; 再进&#xff1a; 都是花指令&#xff0c;所以要先解决花指令 三、解决花指令&#xff0c;得到完整的 main 往上面翻&#xff0c;注意看爆红的&#x…...

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…...

每日一题 414. 第三大的数

414. 第三大的数 简单 class Solution { public:int thirdMax(vector<int>& nums) {int n nums.size();long first , second,third;first second third LONG_MIN ;bool find false;for(auto num : nums){if(num > first){ third second;second first…...

TVM框架学习笔记

TVM是陈天齐等人一个开源的深度学习编译器栈,用于优化和部署机器学习模型到各种硬件后端。它支持多种前端框架,如TensorFlow、PyTorch、ONNX等,并且可以在不同的硬件平台上运行,包括CPU、GPU和专用加速器。官方文档: Apache TVM Documentation — tvm 0.20.dev0 documenta…...

Codeforces Round 998 (Div. 3)

文章目录 EF E 原题链接 思路&#xff1a; 题目要求对于 G 中存在路径的两个点&#xff0c;在 F 中也必须存在路径&#xff0c;不是两个点存在直连的边。 两个点存在路径&#xff0c;说明俩个点在同一个连通块。我们用并查集来维护图的连通块。 最终的要求就是把 F 的并查集通…...

Vue.js 渐进式增强:如何逐步为传统项目注入活力

Vue.js 是一个渐进式框架&#xff0c;这意味着你可以将它逐步引入到现有项目中&#xff0c;而无需彻底重构。渐进式增强特别适合那些已经在使用传统服务器渲染框架&#xff08;如 PHP、Django、Laravel&#xff09;的项目&#xff0c;为它们增加动态交互功能。本篇教程将介绍如…...

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为&#xff1a; 公平组合游戏、非公平组合游戏&#xff08;绝大多数的棋类游戏&#xff09;和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子&#xff0c;两个人轮流拿&#xff0c;每次可以拿1~m颗…...

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年&#xff0c;科技的浪潮汹涌澎湃&#xff0c;人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰&#xff0c;方便了大家的日常生活&#xff0c;也照亮了人类未来的道路。这一年&#xff0c;科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…...

【0x06】HCI_Authentication_Complete事件详解

目录 一、事件概述 二、事件格式及参数 2.1. HCI_Authentication_Complete事件格式 2.2. Status 2.3. Connection_Handle 三、事件的生成于处理 3.1. 事件生成 3.2. 认证流程 3.2.1. 发送认证请求 3.2.2. 处理流程 3.2.3. 示例代码 四、应用场景 4.1. 设备配对与连…...

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 捕获阶段&#xff1a;Document - Element html - Elementbody - Element div…...

电子应用设计方案103:智能家庭AI浴缸系统设计

智能家庭 AI 浴缸系统设计 一、引言 智能家庭 AI 浴缸系统旨在为用户提供更加舒适、便捷和个性化的沐浴体验&#xff0c;融合了人工智能技术和先进的水疗功能。 二、系统概述 1. 系统目标 - 实现水温、水位和水流的精确控制。 - 提供多种按摩模式和水疗功能。 - 具备智能清洁…...

linux静态库+嵌套makefile

linux静态库嵌套makefile 文章目录 linux静态库嵌套makefile1、概述2、代码结构3、代码1&#xff09;main.c2&#xff09;主makefile3&#xff09;fun.c4&#xff09;func.h5&#xff09;静态库makefile 4、运行效果1&#xff09;在main.c目录下执行make2&#xff09;到output目…...

AIP-127 HTTP和gRPC转码

编号127原文链接AIP-127: HTTP and gRPC Transcoding状态批准创建日期2019-08-22更新日期2019-08-22 遵守面向资源设计的API使用RPC进行定义&#xff0c;但面向资源设计框架允许这些API表现为整体上符合REST/JSON约定的接口。这一点很重要&#xff0c;可以帮助开发者利用现有知…...

代码随想录算法训练营day32

代码随想录算法训练营 —day32 文章目录 代码随想录算法训练营前言一、动态规划理论基础二、509. 斐波那契数动态规划动态规划优化空间版递归法 三、70. 爬楼梯动态规划动态规划空间优化 746. 使用最小花费爬楼梯动态规划空间优化 总结 前言 今天是算法营的第32天&#xff0c…...

设计模式的艺术-开闭原则

原则使用频率图&#xff08;仅供参考&#xff09; 1.如何理解开闭原则 简单来说&#xff0c;开闭原则指的是 “对扩展开放&#xff0c;对修改关闭”。 当软件系统需要增加新的功能时&#xff0c;应该通过扩展现有代码的方式来实现&#xff0c;而不是去修改已有的代码。 例如我…...

【易康eCognition实验教程】003:点云数据加载浏览与操作详解

文章目录 一、加载并创建点云数据二、三维浏览1. 点云模式2. 点云视图设置 三、使用点云 一、加载并创建点云数据 本实验点云数据位于专栏配套实验数据包中的data003.rar中的terrian.las&#xff0c;解压后进行以下实验操作。 打开ecognition软件&#xff0c;点击【File】→【…...

海外雅思备考经验

1.18号斯图雅思考试 第一次考雅思&#xff0c;第一次在国外考雅思&#xff01; 最近在德国斯图加特联培&#xff0c;报考了1月18号的雅思机考&#xff0c;下面分享一些考试经验. ✌️考试地点 EZ Plus WEST Hasenbergstr. 31/1,, in the backyard of Hasenbergstrae 31, Stuttg…...

Oracle之Merge into函数使用

Merge into函数为Oracle 9i添加的语法&#xff0c;用来合并update和insert语句。所以也经常用于update语句的查询优化&#xff1a; 一、语法格式&#xff1a; merge into A using B on (A.a B.a) --注意on后面带括号&#xff0c;且不能更新join的字段 when matched then upd…...

Spring Boot 自定义属性

Spring Boot 自定义属性 在 Spring Boot 应用程序中&#xff0c;application.yml 是一个常用的配置文件格式。它允许我们以层次化的方式组织配置信息&#xff0c;并且比传统的 .properties 文件更加直观。 本文将介绍如何在 Spring Boot 中读取和使用 application.yml 中的配…...

前端面试题-问答篇-5万字!

1. 请描述CSS中的层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;规则&#xff0c;以及它们在实际开发中的应用。 在CSS中&#xff0c;层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;是两个关键的规则&#x…...

2025年1月21日(树莓派点亮呼吸灯第一次修改)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…...

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…...

JavaScript系列(41)--状态管理实现详解

JavaScript状态管理实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的状态管理实现。状态管理是现代前端应用中的核心概念&#xff0c;它帮助我们有效地管理和同步应用数据。 状态管理基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;状态管理是一…...

flume和kafka整合 flume和kafka为什么一起用?

‌Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。‌‌12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…...

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…...

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…...

IOS 自定义代理协议Delegate

QuestionViewCell.h文件代码&#xff0c;定义代理协议 protocol QuestionViewCellDelegate <NSObject>- (void)cellIsOpenDidChangeAtIndexPath:(NSIndexPath *)indexPath;endinterface QuestionViewCell : UITableViewCellproperty (nonatomic, weak) id<QuestionVi…...

【flutter版本升级】【Nativeshell适配】nativeshell需要做哪些更改

flutter 从3.13.9 升级&#xff1a;3.27.2 nativeshell组合库中的 1、nativeshell_build库替换为github上的最新代码 可以解决两个问题&#xff1a; 一个是arg("--ExtraFrontEndOptions--no-sound-null-safety") 在新版flutter中这个构建参数不支持了导致的build错误…...

C#编程:List.ForEach与foreach循环的深度对比

在C#中&#xff0c;List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作&#xff0c;但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名&#xff1a;public void ForEach(Action<T> action)类型&#xff1a;…...

leetcode_2762. 不间断子数组

2762. 不间断子数组 - 力扣&#xff08;LeetCode&#xff09; 运用滑动窗口和multise(平衡二叉树实现) 符合条件 右窗口向右扩展 不符合条件 左窗口向左扩展 class Solution { public:long long continuousSubarrays(vector<int>& nums) {int max, min; //表示窗…...

Java学习教程,从入门到精通,JDBC创建数据库语法知识点及案例代码(99)

JDBC创建数据库语法知识点及案例代码 一、JDBC创建数据库语法 在JDBC中&#xff0c;创建数据库主要通过执行SQL语句来实现。其基本语法如下&#xff1a; CREATE DATABASE database_name;CREATE DATABASE 是固定的SQL语句关键字&#xff0c;用于指定创建数据库的操作。databa…...

进阶——第十六届蓝桥杯(sscanf的运用)

声明变量 char tx_buf[30];char rx_buf[30];char car_type[5];char car_num[5];char car_time[15]; int sscanf(const char *str, const char *format,...); sscanf函数功能 sscanf 函数从字符串 str 中读取数据&#xff0c;根据 format 所指定的格式将数据存储到后续的变量中…...

嵌入式硬件篇---ADC模拟-数字转换

文章目录 前言第一部分&#xff1a;STM32 ADC的主要特点1.分辨率2.多通道3.转换模式4.转换速度5.触发源6.数据对齐7.温度传感器和Vrefint通道 第二部分&#xff1a;STM32 ADC的工作流程&#xff1a;1.配置ADC2.启动ADC转换 第三部分&#xff1a;ADC转化1.抽样2.量化3.编码 第四…...

Spark Streaming编程基础

文章目录 1. 流式词频统计1.1 Spark Streaming编程步骤1.2 流式词频统计项目1.2.1 创建项目1.2.2 添加项目依赖1.2.3 修改源目录1.2.4 添加scala-sdk库1.2.5 创建日志属性文件 1.3 创建词频统计对象1.4 利用nc发送数据1.5 启动应用&#xff0c;查看结果 2. 编程模型的基本概念3…...

android wifi AsyncChannel(WifiManager和WifiP2pManager)

AynscChannel的讲解 [Android]AsyncChannel介绍-CSDN博客 WifiP2pManager里的channel的使用理解 WifiP2pManager.java public void createGroup(Channel c, ActionListener listener) {checkChannel(c);c.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PE…...

生存网络与mlr3proba

在R语言中,mlr3包是一个用于机器学习的强大工具包。它提供了一种简单且灵活的方式来执行超参数调整。 生存网络是一种用于生存分析的模型,常用在医学和生物学领域。生存分析是一种统计方法,用于研究事件发生的时间和相关因素对事件发生的影响。生存网络可以用来预测个体在给…...

C#Object类型的索引,序列化和反序列化

前言 最近在编写一篇关于标准Mes接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性&#xff0c;所以我一开始选取了Object类型作为数据类型&#xff0c;Object作为数据Value字段&#xff0c;String作为数据Key字段&#xff0c…...

【动态规划】记忆化搜索

Ban or Problem - A - Codeforces 【CCPC】2022年绵阳站部分题解&#xff08;ACGM&#xff09;_ban or pick, whats the trick-CSDN博客 #include<iostream> using namespace std; #include<cstring> #include<algorithm> #define inf -0x3f3f3f3f #defi…...

深度学习 DAY1:RNN 神经网络及其变体网络(LSTM、GRU)

实验介绍 RNN 网络是一种基础的多层反馈神经网络&#xff0c;该神经网络的节点定向连接成环&#xff0c;其内部状态可以展示动态时序行为。相比于前馈神经网络&#xff0c;该网络内部具有很强的记忆性&#xff0c;它可以利用它内部的记忆来处理任意时序的输入序列&#xff0c;…...

BW复制ERP数据源跑程序激活后才可见

场景&#xff1a; BW提取ERP数据走ODP通道之后&#xff0c;数据源需要用下列程序激活加入白名单后才能被BW系统访问到&#xff1b; 检查&#xff1a; 1、RSA6检查数据源是否可正常使用&#xff0c;若为绿√表示可正常访问&#xff0c;反之&#xff0c;则不行。 2、白名单表ROO…...

MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索

资源引用&#xff1a; 147.寻找独一无二的糖葫芦串 119.游戏队友搜索 今日小记&#xff1a; 回乡聚会陪家人&#xff0c;休息一天~ 稀土掘金-147.寻找独一无二的糖葫芦串&#xff08;147.寻找独一无二的糖葫芦串&#xff09; 题目分析&#xff1a; 给定n个长度为m的字符串表…...

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整 0 前言 之前文章添加了一个自定义的模块&#xff0c;本篇文章在之前的自定义模块中&#xff0c;添加两个自定义参数 使用QGC显示出来&#xff0c;并通过QGC调整参数值&#xff0c;代码实现参数更新 新增的参…...

【全栈】SprintBoot+vue3迷你商城-扩展:vue3项目创建及目录介绍

【全栈】SprintBootvue3迷你商城-扩展&#xff1a;vue3项目创建及目录介绍 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】SprintBootvu…...

Linux系统 C/C++编程基础——基于Qt的图形用户界面编程

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周四了&#xff0c;距离除夕只有4天了&#xff0c;各位今年卫生都搞完了吗&#xff01;&#x1f606; 本文是接着昨天Linux 系统C/C编程的知识继续讲&#xff0c;基于Qt的图形用户界面编程概念及其命令&#xff0c;后续会不断…...