【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)
- Frame Type (高 4 位): 表示帧类型。
-
第二字节 :
- AVC 格式 : 如果是 AVC 格式 , 则 第 2 字节是 AVC Packet Type 字段 , 第 3 ~ 5 字节是 Composition Time Offset 字段 , 从第 6 字节开始就是真实的视频数据 ;
- 非 AVC 格式 : 如果不是 AVC 格式 , 则 从第 2 字节开始都是 真实视频数据 ;
字段名称 | 长度 | 描述 |
---|---|---|
Frame Type 和 Codec ID | 1 字节 | 高 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 Type | 1 字节 | 仅适用于 AVC 格式: 0 - AVC sequence header 1 - AVC NALU 2 - AVC end of sequence |
Composition Time Offset | 3 字节 | 仅适用于 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 字段的取值及其含义如下 :
值 | 类型 | 描述 |
---|---|---|
0 | AVC Sequence Header | 包含 解码器 初始化信息 AVCDecoderConfigurationRecord , 如 : SPS 序列参数集 和 PPS 图像参数集 |
1 | AVC NALU | 存储实际的视频帧数据,基于 H.264 的 NALU(网络抽象层单元)。 |
2 | AVC 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 的具体结构 :
字段名称 | 长度 | 描述 |
---|---|---|
configurationVersion | 1 字节 | 配置版本号,固定为 1 。 |
AVCProfileIndication | 1 字节 | H.264 的 Profile , 例如: - 66: Baseline Profile - 77: Main Profile - 100: High Profile。 |
profileCompatibility | 1 字节 | 与 Profile 的兼容性相关,通常与 SPS 中的 constraint_set_flags 一致。 |
AVCLevelIndication | 1 字节 | H.264 的 Level ,例如: - 30: Level 3.0 - 31: Level 3.1 - 40: Level 4.0。 |
lengthSizeMinusOne | 1 字节 | 表示 NALU 长度字段的字节数减 1: - 值为 0:NALU 长度字段为 1 字节 - 值为 3:NALU 长度字段为 4 字节(常见)。 |
numOfSequenceParameterSets | 1 字节 | SPS(序列参数集)的数量,通常为 1 。 |
sequenceParameterSetLength | 2 字节 | SPS 数据的长度(以字节为单位)。 |
sequenceParameterSetNALUnit | 可变长度 | 实际的 SPS 数据内容。 |
numOfPictureParameterSets | 1 字节 | PPS(图片参数集)的数量,通常为 1 。 |
pictureParameterSetLength | 2 字节 | 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 10 | 10 位深度的高质量场景 | - 支持更高的色彩深度(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.0 | 176×144 | 15 | 0.064 | 视频会议、低分辨率移动设备。 |
1.1 | 176×144 | 30 | 0.192 | 移动设备的视频应用。 |
1.2 | 320×240 | 30 | 0.384 | 更高分辨率的移动设备应用。 |
1.3 | 352×288 | 30 | 0.768 | 低分辨率流媒体应用。 |
2.0 | 352×288 | 30 | 2.0 | 标清视频。 |
3.0 | 720×576 | 30 | 10.0 | 标清流媒体和存储视频。 |
3.1 | 1280×720 | 30 | 14.0 | 高清 (720p) 视频传输。 |
3.2 | 1280×720 | 60 | 20.0 | 高帧率 720p 视频传输。 |
4.0 | 1920×1080 | 30 | 25.0 | 高清 (1080p) 蓝光和流媒体。 |
4.1 | 1920×1080 | 60 | 50.0 | 高帧率 1080p 视频。 |
5.0 | 3840×2160 | 30 | 135.0 | 超高清视频 (4K)。 |
5.1 | 3840×2160 | 60 | 240.0 | 高帧率超高清视频 (4K)。 |
6.0 | 8192×4320 | 30 | 600.0 | 超高清视频 (8K)。 |
6.1 | 8192×4320 | 60 | 960.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 Length | 1, 2, 或 4 字节 | 表示 NALU 数据(Header + Payload)的长度,通常为大端序 (Big-Endian) 格式。 |
NALU Header | 1 字节 | 包括以下三个部分: |
- 1 bit | forbidden_zero_bit :必须为 0,表示无语法错误。 | |
- 2 bits | nal_ref_idc :NALU 优先级,值越大优先级越高。 | |
- 5 bits | nal_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_bit | 1 bit | 保留位,必须为 0 ,表示无语法错误。 |
nal_ref_idc | 2 bits | 表示该 NALU 的优先级,值越大优先级越高。 |
nal_unit_type | 5 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 Type | uint8 | 1 | 指定AVC数据包的类型。0表示Sequence Header;1表示NALU;2表示End of Sequence。 |
Composition Time | int24 | 3 | 表示帧的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 配置环境变量(可选) 1.5 编写启动的脚本 1.6 开放端口 1.7 访问 2、项目实战 2.1 引入依赖 2.2 配置yml文件 2.3 编写Minio配置类 2.4…...
【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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,这里是借助renderjs进行SSE连接 正文 引入event-source-polyfill 这里演示的是直接将代码下载到本地进行引入 下载地址 把里面的eventsource.min.js文件放到项目中的static文件夹 项目封装event-source.vue组件 <templ…...
[SCTF2019]babyre
[SCTF2019]babyre 一、查壳 无壳,64位 二、IDA分析 1.没有main,那就shifef12 点击: 再进: 都是花指令,所以要先解决花指令 三、解决花指令,得到完整的 main 往上面翻,注意看爆红的&#x…...
简洁实用的wordpress外贸模板
简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸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 原题链接 思路: 题目要求对于 G 中存在路径的两个点,在 F 中也必须存在路径,不是两个点存在直连的边。 两个点存在路径,说明俩个点在同一个连通块。我们用并查集来维护图的连通块。 最终的要求就是把 F 的并查集通…...
Vue.js 渐进式增强:如何逐步为传统项目注入活力
Vue.js 是一个渐进式框架,这意味着你可以将它逐步引入到现有项目中,而无需彻底重构。渐进式增强特别适合那些已经在使用传统服务器渲染框架(如 PHP、Django、Laravel)的项目,为它们增加动态交互功能。本篇教程将介绍如…...
【算法】经典博弈论问题——巴什博弈 python
目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为: 公平组合游戏、非公平组合游戏(绝大多数的棋类游戏)和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子,两个人轮流拿,每次可以拿1~m颗…...
【技术洞察】2024科技绘卷:浪潮、突破、未来
涌动与突破 2024年,科技的浪潮汹涌澎湃,人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰,方便了大家的日常生活,也照亮了人类未来的道路。这一年,科技的突破与创新不断刷新着人们对未来的想象。那么回顾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标签,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 捕获阶段:Document - Element html - Elementbody - Element div…...
电子应用设计方案103:智能家庭AI浴缸系统设计
智能家庭 AI 浴缸系统设计 一、引言 智能家庭 AI 浴缸系统旨在为用户提供更加舒适、便捷和个性化的沐浴体验,融合了人工智能技术和先进的水疗功能。 二、系统概述 1. 系统目标 - 实现水温、水位和水流的精确控制。 - 提供多种按摩模式和水疗功能。 - 具备智能清洁…...
linux静态库+嵌套makefile
linux静态库嵌套makefile 文章目录 linux静态库嵌套makefile1、概述2、代码结构3、代码1)main.c2)主makefile3)fun.c4)func.h5)静态库makefile 4、运行效果1)在main.c目录下执行make2)到output目…...
AIP-127 HTTP和gRPC转码
编号127原文链接AIP-127: HTTP and gRPC Transcoding状态批准创建日期2019-08-22更新日期2019-08-22 遵守面向资源设计的API使用RPC进行定义,但面向资源设计框架允许这些API表现为整体上符合REST/JSON约定的接口。这一点很重要,可以帮助开发者利用现有知…...
代码随想录算法训练营day32
代码随想录算法训练营 —day32 文章目录 代码随想录算法训练营前言一、动态规划理论基础二、509. 斐波那契数动态规划动态规划优化空间版递归法 三、70. 爬楼梯动态规划动态规划空间优化 746. 使用最小花费爬楼梯动态规划空间优化 总结 前言 今天是算法营的第32天,…...
设计模式的艺术-开闭原则
原则使用频率图(仅供参考) 1.如何理解开闭原则 简单来说,开闭原则指的是 “对扩展开放,对修改关闭”。 当软件系统需要增加新的功能时,应该通过扩展现有代码的方式来实现,而不是去修改已有的代码。 例如我…...
【易康eCognition实验教程】003:点云数据加载浏览与操作详解
文章目录 一、加载并创建点云数据二、三维浏览1. 点云模式2. 点云视图设置 三、使用点云 一、加载并创建点云数据 本实验点云数据位于专栏配套实验数据包中的data003.rar中的terrian.las,解压后进行以下实验操作。 打开ecognition软件,点击【File】→【…...
海外雅思备考经验
1.18号斯图雅思考试 第一次考雅思,第一次在国外考雅思! 最近在德国斯图加特联培,报考了1月18号的雅思机考,下面分享一些考试经验. ✌️考试地点 EZ Plus WEST Hasenbergstr. 31/1,, in the backyard of Hasenbergstrae 31, Stuttg…...
Oracle之Merge into函数使用
Merge into函数为Oracle 9i添加的语法,用来合并update和insert语句。所以也经常用于update语句的查询优化: 一、语法格式: merge into A using B on (A.a B.a) --注意on后面带括号,且不能更新join的字段 when matched then upd…...
Spring Boot 自定义属性
Spring Boot 自定义属性 在 Spring Boot 应用程序中,application.yml 是一个常用的配置文件格式。它允许我们以层次化的方式组织配置信息,并且比传统的 .properties 文件更加直观。 本文将介绍如何在 Spring Boot 中读取和使用 application.yml 中的配…...
前端面试题-问答篇-5万字!
1. 请描述CSS中的层叠(Cascade)和继承(Inheritance)规则,以及它们在实际开发中的应用。 在CSS中,层叠(Cascade)和继承(Inheritance)是两个关键的规则&#x…...
2025年1月21日(树莓派点亮呼吸灯第一次修改)
系统信息: Raspberry Pi Zero 2W 系统版本: 2024-10-22-raspios-bullseye-armhf Python 版本:Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标:…...
【Linux网络编程】传输层协议
目录 一,传输层的介绍 二,UDP协议 2-1,UDP的特点 2-2,UDP协议端格式 三,TCP协议 3-1,TCP报文格式 3-2,TCP三次握手 3-3,TCP四次挥手 3-4,滑动窗口 3-5…...
JavaScript系列(41)--状态管理实现详解
JavaScript状态管理实现详解 🔄 今天,让我们深入探讨JavaScript的状态管理实现。状态管理是现代前端应用中的核心概念,它帮助我们有效地管理和同步应用数据。 状态管理基础概念 🌟 💡 小知识:状态管理是一…...
flume和kafka整合 flume和kafka为什么一起用?
Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…...
【深度学习】 自动微分
自动微分 正如上节所说,求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单,只需要一些基本的微积分。 但对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。 深度学习框架通过自动…...
什么是三高架构?
大家好,我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性(High Availability)、高性能ÿ…...
IOS 自定义代理协议Delegate
QuestionViewCell.h文件代码,定义代理协议 protocol QuestionViewCellDelegate <NSObject>- (void)cellIsOpenDidChangeAtIndexPath:(NSIndexPath *)indexPath;endinterface QuestionViewCell : UITableViewCellproperty (nonatomic, weak) id<QuestionVi…...
【flutter版本升级】【Nativeshell适配】nativeshell需要做哪些更改
flutter 从3.13.9 升级:3.27.2 nativeshell组合库中的 1、nativeshell_build库替换为github上的最新代码 可以解决两个问题: 一个是arg("--ExtraFrontEndOptions--no-sound-null-safety") 在新版flutter中这个构建参数不支持了导致的build错误…...
C#编程:List.ForEach与foreach循环的深度对比
在C#中,List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作,但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名:public void ForEach(Action<T> action)类型:…...
leetcode_2762. 不间断子数组
2762. 不间断子数组 - 力扣(LeetCode) 运用滑动窗口和multise(平衡二叉树实现) 符合条件 右窗口向右扩展 不符合条件 左窗口向左扩展 class Solution { public:long long continuousSubarrays(vector<int>& nums) {int max, min; //表示窗…...
Java学习教程,从入门到精通,JDBC创建数据库语法知识点及案例代码(99)
JDBC创建数据库语法知识点及案例代码 一、JDBC创建数据库语法 在JDBC中,创建数据库主要通过执行SQL语句来实现。其基本语法如下: CREATE DATABASE database_name;CREATE DATABASE 是固定的SQL语句关键字,用于指定创建数据库的操作。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 中读取数据,根据 format 所指定的格式将数据存储到后续的变量中…...
嵌入式硬件篇---ADC模拟-数字转换
文章目录 前言第一部分:STM32 ADC的主要特点1.分辨率2.多通道3.转换模式4.转换速度5.触发源6.数据对齐7.温度传感器和Vrefint通道 第二部分:STM32 ADC的工作流程:1.配置ADC2.启动ADC转换 第三部分: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 启动应用,查看结果 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接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性,所以我一开始选取了Object类型作为数据类型,Object作为数据Value字段,String作为数据Key字段,…...
【动态规划】记忆化搜索
Ban or Problem - A - Codeforces 【CCPC】2022年绵阳站部分题解(ACGM)_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 网络是一种基础的多层反馈神经网络,该神经网络的节点定向连接成环,其内部状态可以展示动态时序行为。相比于前馈神经网络,该网络内部具有很强的记忆性,它可以利用它内部的记忆来处理任意时序的输入序列,…...
BW复制ERP数据源跑程序激活后才可见
场景: BW提取ERP数据走ODP通道之后,数据源需要用下列程序激活加入白名单后才能被BW系统访问到; 检查: 1、RSA6检查数据源是否可正常使用,若为绿√表示可正常访问,反之,则不行。 2、白名单表ROO…...
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
资源引用: 147.寻找独一无二的糖葫芦串 119.游戏队友搜索 今日小记: 回乡聚会陪家人,休息一天~ 稀土掘金-147.寻找独一无二的糖葫芦串(147.寻找独一无二的糖葫芦串) 题目分析: 给定n个长度为m的字符串表…...
无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整
无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整 0 前言 之前文章添加了一个自定义的模块,本篇文章在之前的自定义模块中,添加两个自定义参数 使用QGC显示出来,并通过QGC调整参数值,代码实现参数更新 新增的参…...
【全栈】SprintBoot+vue3迷你商城-扩展:vue3项目创建及目录介绍
【全栈】SprintBootvue3迷你商城-扩展:vue3项目创建及目录介绍 往期的文章都在这里啦,大家有兴趣可以看一下 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】SprintBootvu…...
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
ℹ️大家好,我是练小杰,今天周四了,距离除夕只有4天了,各位今年卫生都搞完了吗!😆 本文是接着昨天Linux 系统C/C编程的知识继续讲,基于Qt的图形用户界面编程概念及其命令,后续会不断…...