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

【音视频】FLV格式分析

FLV概述

  • FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。

  • FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后的第⼀个Pervious Tag Size的值为0。

  • Tag⼀般可以分为3种类型:脚本(帧)数据类型、⾳频数据类型、视频数据。FLV数据以⼤端序进⾏存储,在解析时需要注意。

⼀个标准FLV⽂件结构如下图:

在这里插入图片描述

FLV⽂件的详细内容结构如下图:

在这里插入图片描述

大体的解析框架

在这里插入图片描述

FLV header

注:在下⾯的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其⻓度是多少位。

  • ⽐如UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。

  • UB表示位域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。

  • FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。

  • ⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。

FLV头的结构如下:

Field TypeComment
UI8签名 ‘F’ (0x46)
UI8签名 ‘L’ (0x4C)
UI8签名 ‘V’ (0x56)
UI8FLV 版本。0x01 表示 FLV 版本为 1
UB5保留字段,前五位均为 0
UB1音频流标识:1 表示存在音频流,0 表示不存在
UB1保留字段,固定为 0
UB1视频流标识:1 表示存在视频流,0 表示不存在
UI32文件头大小。
FLV 版本 1 时填写 9(包括这四个字节),用于后续版本扩展

FLV Body

  • FLV Header之后,就是FLV File BodyFLV File Body是由⼀连串的back-pointers + tags构成。
  • Back-pointer表示Previous Tag Size(前⼀个tag的字节数据⻓度),占4个字节。

在这里插入图片描述

FLV Tag

  • 每⼀个Tag也是由两部分组成:tag headertag data
  • Tag Header⾥存放的是当前tag的类型、数据区(tag data)的⻓度等信息。
tag header

tag header⼀般占11个字节的内存空间。FLV tag结构如下:

FieldTypeComment
Tag类型 TypeUI88: audio  9: video  18: Script data(脚本数据)
Others: reserved(其他所有值未使用)
数据区大小UI24当前 tag 的数据域的大小,不包含 tag header。
Length of the data in the Data field
时间戳 TimestampUI24当前帧时戳,单位是毫秒。相对值,第一个 tag 的时戳总是为 0
时戳扩展字段 TimestampExtendedUI8若时戳大于 0xFFFFFF,将使用该字节。该字节是时戳的高 8 位,前三个字节是低 24 位。
StreamIDUI24总是为 0
数据域UI[8*n]数据域数据
**注意:
  1. flv⽂件中TimestampTimestamp Extended拼出来的是dts。也就是解码时间。TimestampTimestamp Extended拼出来dts单位为ms。(如果不存在B帧,当然dts等于pts)

  2. CompositionTime 表示PTS相对于DTS的偏移值, 在每个视频tag的第14~16字节, 显示时间(pts) = 解码时间(tag的第5~8字节) + CompositionTimeCompositionTime的单位也是ms

  3. Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等信息。

Script Tag Data结构(脚本类型、帧类型)

该类型Tag⼜被称为MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:durationwidthheight等。通常该类型Tag会作为FLV⽂件的第⼀个tag,并且只有⼀个,跟在File Header后。该类型Tag Data的结构如下所示(source.200kbps.768x320.flv⽂件为例):

1. AMF 的定义与本质
  • 全称:Action Message Format(动作消息格式),是 Adobe 为 Flash 技术栈设计的二进制数据交换格式。
  • 作用:在 FLV 中,AMF 包用于封装脚本数据(对应 FLV 中的 Script Data Tag,即类型为 18 的 Tag),例如视频元数据、播放控制指令、自定义脚本逻辑数据等。
2. FLV 中 AMF 包的典型应用场景
  • 元数据传输
    存储视频的元信息,如视频标题、作者、时长、视频宽高、音频采样率等。例如,FLV 文件中常通过 AMF 包传递 onMetaData 数据,播放器解析这些数据后,可展示视频相关信息。
  • 脚本逻辑交互
    承载 ActionScript 代码需要的结构化数据,支持复杂对象(如数组、对象嵌套)的传输,实现播放流程控制(如跳转关键帧、获取播放状态等)。

在这里插入图片描述

  • 第⼀个AMF包:第1个字节表示AMF包类型,⼀般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的⻓度,⼀般总是0x000A(“onMetaData”⻓度)。后⾯字节为具体的字符串,⼀般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

  • 第⼆个AMF包:第1个字节表示AMF包类型,⼀般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如下表所示。

Comment例如
duration时长(秒)210.732
width视频宽度768.000
height视频高度320.000
videodatarate视频码率207.260
framerate视频帧率25.000
videocodecid视频编码ID7.000 (H264为7)
audiodatarate音频码率29.329
audiosamplerate音频采样率44100.000
stereo是否立体声1
audiocodecid音频编码ID10.000 (AAC为10)
major_brand格式规范相关isom
minor_version格式规范相关512
compatible_brands格式规范相关isomiso2avc1mp41
encoder封装工具名称Lavf54.63.104
filesize文件大小(字节)6636853.000

注:Lavf54.63.104即是 Libavformat version 54.63.104. 即是ffmpeg对于库的版本

在 AMF 数据结构中,每个数据项(包括键值对中的值)的格式都是 字符串名字(2字节)+类型标识(1 字节) + 数据内容。具体来说:

1.字符串名字(2字节)

  • 表示每个key的名字,如duration等等

1. 类型标识(2 字节)

  • 每个数据项的第一个字节固定为 类型标识,用于明确后续数据的格式。例如:
    • 0x02 → 字符串类型
    • 0x00 → 数值类型(双精度浮点数)
    • 0x01 → 布尔类型
    • 0x03 → 对象类型
    • …(其他类型见 AMF 规范)

3. 数据内容

  • 根据类型标识的不同,后续数据的格式和长度也不同。例如:
    • 字符串类型
      • 第 1 字节:0x02
      • 第 2 - 3 字节:UI16 表示字符串长度(如 0x000A 表示 10 字节)
      • 后续字节:具体字符(如 onMetaData 共 10 字节)
    • 数值类型(双精度浮点数)
      • 第 1 字节:0x00
      • 后续 8 字节:IEEE 754 双精度浮点数(如 0x4048000000000000 表示 640.0)
    • 布尔类型
      • 第 1 字节:0x01
      • 第 2 字节:0x00(false)或 0x01(true)

4. 键值对的结构

  • 在元数据数组中,每个键值对的格式为:
    1. 键(字符串):类型标识 0x02 + 字符串长度 + 字符串内容。
    2. :根据值的类型,以对应类型标识开头,后跟数据内容。

示例解析

假设元数据数组中有一个键值对 "width": 640,其二进制结构如下:

  • 键(“width”)
  • 字符串长度:2字节
    • 类型标识:0x02
    • 长度:0x0005(5 字节)
    • 内容:77,69,69,6B,74(ASCII 字符 “width”)
  • 值(640)
    • 类型标识:0x00
    • 双精度浮点数:4048000000000000(对应十进制 640.0)

总结

每个数据项(无论是键还是值)都严格遵循 类型标识 + 数据内容 的格式,解析时只需按顺序读取类型标识,再根据类型读取对应长度的数据即可

在这里插入图片描述

在这里插入图片描述

Audio Tag Data结构 (音频类型)

⾳频Tag Data区域开始的:

  • 第⼀个字节包含了⾳频数据的参数信息
  • 第⼆个字节开始为⾳频流数据。

(这两个字节属于tag的data部分,不是header部分)

第⼀个字节为⾳频的信息(仔细看spec发现对于AAC⽽⾔,⽐较有⽤的字段是SoundFormat),格式如下:

FieldTypeComment
音频格式 SoundFormatUB40 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16−kHz mono
5 = Nellymoser 8−kHz mono
6 = Nellymoser
7 = G.711 A−law logarithmic PCM
8 = G.711 mu−law logarithmic PCM 9 = reserved
10 = AAC
11 = Speex 14 = MP3 8−Khz
15 = Device−specific sound
采样率 SoundRateUB20 = 5.5kHz    1 = 11kHz
2 = 22.05kHz  3 = 44.1kHz
对于AAC总是3。但实际上AAC是可以支持到48khz以上的频率(这个参数对于AAC意义不大)。
采样精度 SoundSizeUB10 = snd8Bit
1 = snd16Bit
此参数仅适用于未压缩的格式,压缩后的格式都是将其设为1
音频声道 SoundTypeUB10 = sndMono 单声道
1 = sndStereo 立体声,双声道
对于AAC总是1

第⼆个字节开始为⾳频数据(需要判断该数据是真正的音频数据,还是音频config信息)

FiledTypeComment
音频数据UI[8*n]if SoundFormat == 10 (AAC类型)
AAC AUDIO DATA
else
Sound data—varies by format
AAC AUDIO DATA

如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。

  • 配置信息

在这里插入图片描述
在这里插入图片描述

这两张表格定义了 AAC 音频配置信息(AudioSpecificConfig)及其相关解析逻辑的语法结构,具体解析如下:


Table 1.15 - AudioSpecificConfig() 语法

语法元素位数记忆符说明
audioObjectType--通过 GetAudioObjectType() 函数获取,用于标识音频对象类型(如 AAC 编码配置)。
samplingFrequencyIndex4bslbf采样率索引,占 4 位。若值为 0xf,则使用扩展的 samplingFrequency(24 位)。
samplingFrequency24uimsbf仅在 samplingFrequencyIndex == 0xf 时出现,存储具体采样率数值。
channelConfiguration4bslbf声道配置,占 4 位,标识音频的声道数(如单声道、立体声等)。
sbrPresentFlag/psPresentFlag--预留标志位(示例中暂未赋值,实际用于标识 SBR、PS 等扩展功能是否存在)。

作用AudioSpecificConfig() 用于存储 AAC 音频的核心配置参数,包括编码类型、采样率、声道数等,是解码器解析音频数据的关键依据。


Table 1.16 - GetAudioObjectType() 语法

语法元素位数记忆符说明
audioObjectType5uimsbf音频对象类型,占 5 位。若值为 31,则通过扩展字段 audioObjectTypeExt 进一步解析。
audioObjectTypeExt6uimsbf仅在 audioObjectType == 31 时使用,扩展音频对象类型(最终值为 32 + audioObjectTypeExt)。

作用GetAudioObjectType() 用于精确解析音频编码的具体配置文件(如 AAC LC、HE-AAC 等),通过 5 位基础值和可能的 6 位扩展值,覆盖更广泛的编码类型。

Video Tag Data结构(视频类型)

视频Tag Data开始的:

  • 第⼀个字节包含视频数据的参数信息,
  • 第⼆个字节开始为视频流数据。

第⼀个字节包含视频信息,格式如下:

FieldTypeComment
帧类型UB41: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧
2: inter frame (for AVC, a non-seekable frame)——h264的普通帧
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
编码IDUB4使用哪种编码类型:
1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2
7: AVC
第⼆个字节开始为视频数据
FieldTypeComment
视频数据UI[8*n]If CodecID == 2
H263VIDEOPACKET
If CodecID == 3
SCREENVIDEOPACKET
If CodecID == 4
VP6FLVIDEOPACKET
If CodecID == 5
VP6FLVALPHAVIDEOPACKET
If CodecID == 6
SCREENV2VIDEOPACKET
if CodecID == 7 (AVC格式)
AVCVIDEOPACKET
AVCVIDEOPACKET

在这里插入图片描述

1. AVCPacketType(UI8,无符号 8 位整数)
  • 作用:标识 AVC 数据包的类型。
  • 取值及含义
    • 0:表示 AVC 序列头(AVC sequence header),通常包含解码器配置信息(如 AVCDecoderConfigurationRecord)。
    • 1:表示 AVC NALU(网络抽象层单元),即实际的视频编码数据(如视频帧的切片数据)。
    • 2:表示 AVC 序列结束(AVC end of sequence),此时底层 NALU 序列结束标记可能不需要或不被支持。
2. CompositionTime(SI24,有符号 24 位整数)
  • 作用:用于标识视频帧的合成时间偏移(仅在特定类型下有效)。
  • 逻辑
    • AVCPacketType == 1 时,该字段表示 NALU 对应的视频帧合成时间偏移。
    • 其他情况下(AVCPacketType02),该字段值为 0
3. Data(UI8[n],无符号 8 位整数数组)
  • 作用:存储不同类型 AVC 数据包的具体数据内容。
  • 逻辑
    • AVCPacketType == 0 时,存储 AVCDecoderConfigurationRecord(解码器配置记录,包含编码参数等信息)。
    • AVCPacketType == 1 时,存储一个或多个 NALU(可以是单个切片,不强制要求完整帧)。
    • AVCPacketType == 2 时,该字段为空(Empty)。

(1)CompositionTime

  • CompositionTime 每个视频tag(整个tag)的第14~16字节(如果是tag data偏移位置索引[2]~[4])(表示PTS相对于DTS的偏移值 )。
  • CompositionTime 单位为ms : 显示时间 = 解码时间(tag的第5~8字节,位置索引[4]~[7]+CompositionTime

2)AVCDecoderConfigurationRecord

  • AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准⽂档“ISO-14496-15 AVC file format”

  • video配置信息

1. AVCDecoderConfigurationRecord 基础字段
字段名称字节数说明
configurationVersion1配置版本,通常为 1
AVCProfileIndication1指示 H.264 Profile(如 0x66 表示 Baseline Profile)。
profile_compatibility1兼容性标识。
AVCLevelIndication1指示 H.264 Level(如 0x1E 表示 Level 3.1)。
lengthSizeMinusOne1NALU 长度字段的字节数减 1(如 3 表示 NALU 长度用 4 字节存储)。
numOfSequenceParameterSets1SPS 的数量,通常为 1
2. SPS 数据
  • sequenceParameterSetLength:2 字节,标识 SPS 数据的长度。
  • sequenceParameterSetNALUnit:长度由 sequenceParameterSetLength 定义,存放实际的 SPS 字节数据。
3. PPS 数据
  • numOfPictureParameterSets:1 字节,PPS 的数量,通常为 1
  • pictureParameterSetLength:2 字节,标识 PPS 数据的长度。
  • pictureParameterSetNALUnit:长度由 pictureParameterSetLength 定义,存放实际的 PPS 字节数据。

FLV时间戳计算

题记:时间戳将每⼀秒分成90000份,即将每⼀毫秒分成90份 在flv中直接存储的都是毫秒级,在TS存储的是时间戳级

  • 其中TS、flv⼀般按照编码顺序排列
  • ⼀个视频tag⼀般只包含⼀帧视频的码流
  • 其中视频tag的时间戳对应的是解码时间戳(DTS/90)

当前序列:

  • 编码顺序 I P P B B B…
  • 对应帧号 0 1 5 3 2 4…

flv对每⼀个tag都规定了它将要播放的时间戳,每个时间戳都可以对应转换特性的时间

  • 其中script(脚本)、video(视频)、audio(⾳频)的第⼀个tag的时间戳值都为0

  • 时间戳占4个字节 其中第四个字节是⾼位 前三个字节是低位(每个tag的5~8字节):如6E 8D A8 01 = 0x 01 6E 8D A8 = 24022440

  • CompositionTime 每个视频tag的第14~16字节(共3字节)(表示PTS相对于DTS的偏移值 )

  • CompositionTime 单位为ms 显示时间 = 解码时间(tag的第5~8字节(共3字节)) + CompositionTime

例如(注意显示时间最后⼀个字节是⾼位)

  • tag0 (脚本) :时间戳为0
  • tag1 (视频) :第⼀个视频时间戳 值为0 ⽆CompositionTime (头信息)
  • tag2 (⾳频) :第⼀个⾳频时间戳 值为0
  • tag3 (视频) :00 00 00 00 值:0 00:00:00:00 (解码时间) CompositionTime:0x 00 00 50 值:80 00:00:00:80 I帧 显示时间: 00:00:00: 80 poc=0
  • tag4 (视频) :00 00 28 00 值:40 00:00:00:40 (解码时间) CompositionTime:0x 00 00 50 值:80 00:00:00:80 P帧 显示时间: 00:00:00: 120 poc=1
  • tag5 (视频) :00 00 50 00 值:80 00:00:00:80 (显示时间) CompositionTime:0x 00 00 C8 值:200 00:00:00:200 P帧 显示时间: 00:00:00: 280 poc=5
  • tag6 (⾳频) :00 00 50 00 值:80 00:00:00:80(显示时间)
  • tag7 (⾳频) :00 00 67 00 值:103 00:00:00:103(显示时间)
  • tag8 (视频) :00 00 78 00 值:120 00:00:00:120 (解码时间) CompositionTime:0x 00 00 50 值:80 00:00:00:80 B帧 显示时间: 00:00:00: 200 poc=3
  • tag9 (⾳频) :00 00 7E 00 值:126 00:00:00:126(显示时间)
  • tag10 (⾳频) :00 00 96 00 值:150 00:00:00:150(显示时间)
  • tag11 (视频) :00 00 A0 00 值:160 00:00:00:160(解码时间) CompositionTime:0x 00 00 00 值:00 00:00:00:00 b帧 显示时间: 00:00:00: 160 poc=2
  • tag12 (⾳频) :00 00 AD 00 值:173 00:00:00:173(显示时间)
  • tag13 (⾳频) :00 00 C4 00 值:196 00:00:00:196(显示时间)
  • tag14(视频) :00 00 C8 00 值:200 00:00:00:200(解码时间) CompositionTime:0x 00 00 28 值:40 00:00:00:40 b帧 显示时间: 00:00:00: 240 poc=4 我们可以看到 每个视频tag相差约40ms 刚好是25fps视频 每帧视频的播放时⻓

在上例中,我们会看到按照解码时间排列

  • 编码顺序 I P P B B B......
  • 对应帧号0 1 5 3 2 4......

更多资料:https://github.com/0voice

相关文章:

【音视频】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和…...

Keil5没有stm32的芯片库

下载完重启就行了,我这里就不演示了,stm已经下载,随便选的一个芯片库演示一下...

【DVWA 靶场通关】 File Inclusion(文件包含漏洞)

1. 前言 文件包含漏洞 是 Web 应用中较为常见的漏洞之一,攻击者通过操控文件路径,访问或包含系统上的敏感文件,甚至执行恶意代码。DVWA(Damn Vulnerable Web Application)提供了一个理想的实验环境,让安全…...

游戏引擎学习第229天

仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务,至少第一步是非常简单的。我们需要在渲染器中加入排序功能,这样我们的精灵(sprites)才能以正确的顺序显示。为此我…...

【C++编程入门】:从零开始掌握基础语法

C语言是通过对C语言不足的地方进行优化创建的,C在C语言之上,C当然也兼容C语言, 在大部分地方使用C比C更方便,可能使用C需要一两百行代码,而C只需要五六十行。 目录 C关键字 命名空间 缺省参数 缺省参数分类 函数…...

Python3网络爬虫开发--爬虫基础

网络爬虫基础 1.1 HTTP基本原理 1.1.1 URI和URL URI即统一资源标志符,URL即统一资源定位符。 有这样一个链接,http://test.com/test.txt,在这个链接中,包含了访问协议https,访问目录(即根目录),资源名称(test.txt)。通过这样的链接,可以在互联网上找到这个资源,这…...

网络开发基础(游戏方向)之 概念名词

前言 1、一款网络游戏分为客户端和服务端两个部分,客户端程序运行在用户的电脑或手机上,服务端程序运行在游戏运营商的服务器上。 2、客户端和服务端之间,服务端和服务端之间一般都是使用TCP网络通信。客户端和客户端之间通过服务端的消息转…...

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…...

【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 📚欢迎订阅专栏…...

k8s介绍与实践

第一节 理论 基础介绍,部署实践,操作实践,点击这里学习 第二节 dashboard操作 查看安装的dashboard服务信息 kubectl get pod,svc -n kubernetes-dashboard 网页登录地址:https://server_ip:30976/#/login 创建token kube…...

SpringBoot 3 与 SpringDoc 打造完美接口文档

文章目录 1. SpringDoc 简介1.1 SpringDoc 优势2. 环境准备2.1 Maven 依赖2.2 基础配置3. 创建基本文档配置类4. 控制器 API 文档注解4.1 基本控制器示例4.2 模型类示例5. 高级功能5.1 API分组5.2 安全配置5.3 隐藏特定端点6. 参数描述6.1 路径参数6.2 查询参数6.3 请求体7. 响…...

【HFP】蓝牙HFP协议音频连接核心技术深度解析

目录 一、音频连接建立的总体要求 1.1 发起主体与时机 1.2 前提条件 1.3 同步连接的建立 1.4 通知机制 二、不同主体发起的音频连接建立流程 2.1 连接建立触发矩阵 2.2 AG 发起的音频连接建立 2.3 HF 发起的音频连接建立 三、编解码器连接建立流程 3.1 发起条件 3.…...

KRaft面试思路引导

Kafka实在2.8之后就用KRaft进行集群管理了 Conroller负责选举Leader,同时Controller管理集群元数据状态信息,并将元数据信息同步给各个分区的Leader 和Zookeeper管理一样,会选出一个Broker作为Controller去管理整个集群,但是元数…...

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…...

14.第二阶段x64游戏实战-分析人物的名字

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:13.第二阶段x64游戏实战-分析人物等级和升级经验 名字(中文英文符号…...

【CS*N是狗】亲测可用!!WIN11上禁用Chrome自动更新IDM插件

现象:每次打开chrome后IDM会弹出提示插件版本不一致。经过排查后发现是chrome把IDM插件给更新了,导致IDM提示版本不匹配。经过摸索后,得到了可行的方案。 第一步,打开Chrome,把IDM插件卸载掉,然后重新安装I…...

漫游git rebase + 浅谈git checkout和git branch -f的分支命令

今天学了两个命令非常有意思:一个是git checkout,一个是git branch -f。我们可以认为在提交树上,任何一个节点代表着一次提交。并且,git commit将会在 H E A D HEAD HEAD指针指向的节点上进行进一步提交。将每一个分支名视为标记当…...

深入理解 React 组件的生命周期:从创建到销毁的全过程

React 作为当今最流行的前端框架之一,其组件生命周期是每个 React 开发者必须掌握的核心概念。本文将全面剖析 React 组件的生命周期,包括类组件的各个生命周期方法和函数组件如何使用 Hooks 模拟生命周期行为,帮助开发者编写更高效、更健壮的…...

基础数学知识-概率论

文章目录 1. 随机事件和概率1. 事件运算规律2. 条件概率3. 事件独立性4. 五大公式5. 古典型概率6. 几何型概率7. n重伯努利试验2. 随机变量与分布1.离散型随机变量2. 连续型随机变量3. 常见分布4. TODO4. 随机变量的数学特征1. 数学期望2. 方差3. 常见分布期望与方差 -- TODO4.…...

OpenCV 图形API(44)颜色空间转换-----将图像从 BGR 色彩空间转换为 RGB 色彩空间函数BGR2RGB()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为RGB色彩空间。 该函数将输入图像从BGR色彩空间转换为RGB。B、G和R通道值的常规范围是0到255。 输出图像是8位无符号3通…...

2025年CMS安全(面试题)

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…...

配置nginx服务,通过多ip区分多网站

首先关闭防火墙,setenforce 0 关过了,不截图了 多IP,首先配置多个IP地址 可以在vm增加虚拟网卡,也可以在同一网卡配置多个IP,我用第一种 记得点确定 查看新的虚拟网卡IP 没有IP,配置一个 安装nginx 写配置 server{listen 192.168.214.130:80;root /www/ip/130; # 资源根目…...

[k8s实战]Containerd 1.7.2 离线安装与配置全指南(生产级优化)

[k8s实战]Containerd 1.7.2 离线安装与配置全指南(生产级优化) 摘要:本文详细讲解在无外网环境下部署 Containerd 1.7.2 容器运行时的完整流程,涵盖二进制包安装、私有镜像仓库配置、Systemd服务集成等关键步骤,并提供…...

C++中const与constexpr的区别

在C中,const和constexpr都用于定义常量,但它们的用途和行为有显著区别: ### 1. **初始化时机** - **const**:表示变量是只读的,但其值可以在**编译时或运行时**初始化。 cpp const int a 5; // 编译…...

解决Windows安全中心显示空白页面

1、电脑重装系统后,发现原本一些软件打不开了,电脑莫名认为有病毒,自动删除插件。附图。 2、第一反应是电脑防火墙的原因,默认威胁防护识别到了病毒软件,自动删除。在开始屏幕搜Windows安全中心,打开之后发…...

三国战纪119通关笔记

文章目录 诸葛一币通关孙姬马王夏侯渊孟优夏侯惇张辽貂蝉吕蒙沙摩柯破阵及吕布陆逊左慈(跳)许褚黄盖彻里吉(跳)魏延(跳)司马懿曹操道具的安排道具-天师符(废弃)道具-九节杖道具-援军令(废弃)道具-土雷(废弃) 笔者是个菜鸡,什么天王难度无伤,天王难度5禁什…...

Android audio系统五 AudioPolicy 策略配置详解

引用:Android 音频策略配置文件解析流程 audio_policy_configuration.xml 是 Android 音频系统的核心配置文件,它定义了音频硬件接口、设备路由和基本策略。下面我将详细介绍这个文件的结构、关键配置项和实际应用。audio_policy_configuration.xml 是 …...

【MQ篇】初识MQ!

目录 一、什么是MQ?简单来说就是个“快递中转站” 📦二、为什么要用MQ?用了它,好处多多!🤩三、MQ的应用场景:各行各业都能用!🌍四、MQ的优缺点:硬币的两面&am…...

2、SpringAI接入ChatGPT与微服务整合

2、SpringAI接入ChatGPT与微服务整合 小薛博客AI 大模型资料 1、SpringAI简介 https://spring.io/projects/spring-ai Spring AI是一个人工智能工程的应用框架。其目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于人工智能领域&#…...

【Linux】多进程任务模块

创建多个进程&#xff0c;同时完成任务 task.c #include <sys/types.h> #include <unistd.h> #include<stdio.h> #include <sys/wait.h> int create_process_tasks(Task_fun_t tasks[],int tsak_cnt) {pid_t pid;int i 0;for(i 0;i < 4;i){pid …...