【音视频】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 Type | Comment |
---|---|
UI8 | 签名 ‘F’ (0x46) |
UI8 | 签名 ‘L’ (0x4C) |
UI8 | 签名 ‘V’ (0x56) |
UI8 | FLV 版本。0x01 表示 FLV 版本为 1 |
UB5 | 保留字段,前五位均为 0 |
UB1 | 音频流标识:1 表示存在音频流,0 表示不存在 |
UB1 | 保留字段,固定为 0 |
UB1 | 视频流标识:1 表示存在视频流,0 表示不存在 |
UI32 | 文件头大小。 FLV 版本 1 时填写 9(包括这四个字节),用于后续版本扩展 |
FLV Body
FLV Header
之后,就是FLV File Body
。FLV File Body
是由⼀连串的back-pointers + tags
构成。Back-pointer
表示Previous Tag Size
(前⼀个tag的字节数据⻓度),占4个字节。
FLV Tag
- 每⼀个Tag也是由两部分组成:
tag header
和tag data
。 Tag Header
⾥存放的是当前tag
的类型、数据区(tag data
)的⻓度等信息。
tag header
tag header
⼀般占11个字节的内存空间。FLV tag
结构如下:
Field | Type | Comment |
---|---|---|
Tag类型 Type | UI8 | 8: audio 9: video 18: Script data(脚本数据) Others: reserved(其他所有值未使用) |
数据区大小 | UI24 | 当前 tag 的数据域的大小,不包含 tag header。 Length of the data in the Data field |
时间戳 Timestamp | UI24 | 当前帧时戳,单位是毫秒。相对值,第一个 tag 的时戳总是为 0 |
时戳扩展字段 TimestampExtended | UI8 | 若时戳大于 0xFFFFFF,将使用该字节。该字节是时戳的高 8 位,前三个字节是低 24 位。 |
StreamID | UI24 | 总是为 0 |
数据域 | UI[8*n] | 数据域数据 |
**注意:
-
flv
⽂件中Timestamp
和Timestamp Extended
拼出来的是dts
。也就是解码时间。Timestamp
和Timestamp Extended
拼出来dts
单位为ms
。(如果不存在B
帧,当然dts
等于pts
) -
CompositionTime
表示PTS
相对于DTS
的偏移值, 在每个视频tag
的第14~16
字节, 显示时间(pts
) = 解码时间(tag
的第5~8
字节) +CompositionTime
,CompositionTime
的单位也是ms
-
Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂件中通常只有⼀个元数据,⾳频
tag
和视频tag
就是⾳视频信息了,采样、声道、频率,编码等信息。
Script Tag Data
结构(脚本类型、帧类型)
该类型Tag⼜被称为MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration
、width
、height
等。通常该类型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 | 视频编码ID | 7.000 (H264为7) |
audiodatarate | 音频码率 | 29.329 |
audiosamplerate | 音频采样率 | 44100.000 |
stereo | 是否立体声 | 1 |
audiocodecid | 音频编码ID | 10.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 字节:
- 数值类型(双精度浮点数):
- 第 1 字节:
0x00
- 后续 8 字节:IEEE 754 双精度浮点数(如
0x4048000000000000
表示 640.0)
- 第 1 字节:
- 布尔类型:
- 第 1 字节:
0x01
- 第 2 字节:
0x00
(false)或0x01
(true)
- 第 1 字节:
- 字符串类型:
4. 键值对的结构
- 在元数据数组中,每个键值对的格式为:
- 键(字符串):类型标识
0x02
+ 字符串长度 + 字符串内容。 - 值:根据值的类型,以对应类型标识开头,后跟数据内容。
- 键(字符串):类型标识
示例解析
假设元数据数组中有一个键值对 "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),格式如下:
Field | Type | Comment |
---|---|---|
音频格式 SoundFormat | UB4 | 0 = 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 |
采样率 SoundRate | UB2 | 0 = 5.5kHz 1 = 11kHz 2 = 22.05kHz 3 = 44.1kHz 对于AAC总是3。但实际上AAC是可以支持到48khz以上的频率(这个参数对于AAC意义不大)。 |
采样精度 SoundSize | UB1 | 0 = snd8Bit 1 = snd16Bit 此参数仅适用于未压缩的格式,压缩后的格式都是将其设为1 |
音频声道 SoundType | UB1 | 0 = sndMono 单声道 1 = sndStereo 立体声,双声道 对于AAC总是1 |
第⼆个字节开始为⾳频数据(需要判断该数据是真正的音频数据,还是音频config信息)
Filed | Type | Comment |
---|---|---|
音频数据 | UI[8*n] | if SoundFormat == 10 (AAC类型) AAC AUDIO DATA else Sound data—varies by format |
AAC AUDIO DATA
![[Pasted image 20250331203842.png|400]]
如果是AAC数据,如果他是AAC RAW
, tag data[3]
开始才是真正的AAC frame data。
- 配置信息
这两张表格定义了 AAC 音频配置信息(AudioSpecificConfig
)及其相关解析逻辑的语法结构,具体解析如下:
Table 1.15 - AudioSpecificConfig() 语法
语法元素 | 位数 | 记忆符 | 说明 |
---|---|---|---|
audioObjectType | - | - | 通过 GetAudioObjectType() 函数获取,用于标识音频对象类型(如 AAC 编码配置)。 |
samplingFrequencyIndex | 4 | bslbf | 采样率索引,占 4 位。若值为 0xf ,则使用扩展的 samplingFrequency (24 位)。 |
samplingFrequency | 24 | uimsbf | 仅在 samplingFrequencyIndex == 0xf 时出现,存储具体采样率数值。 |
channelConfiguration | 4 | bslbf | 声道配置,占 4 位,标识音频的声道数(如单声道、立体声等)。 |
sbrPresentFlag /psPresentFlag | - | - | 预留标志位(示例中暂未赋值,实际用于标识 SBR、PS 等扩展功能是否存在)。 |
作用:AudioSpecificConfig()
用于存储 AAC 音频的核心配置参数,包括编码类型、采样率、声道数等,是解码器解析音频数据的关键依据。
Table 1.16 - GetAudioObjectType() 语法
语法元素 | 位数 | 记忆符 | 说明 |
---|---|---|---|
audioObjectType | 5 | uimsbf | 音频对象类型,占 5 位。若值为 31 ,则通过扩展字段 audioObjectTypeExt 进一步解析。 |
audioObjectTypeExt | 6 | uimsbf | 仅在 audioObjectType == 31 时使用,扩展音频对象类型(最终值为 32 + audioObjectTypeExt )。 |
作用:GetAudioObjectType()
用于精确解析音频编码的具体配置文件(如 AAC LC、HE-AAC 等),通过 5 位基础值和可能的 6 位扩展值,覆盖更广泛的编码类型。
Video Tag Data结构(视频类型)
视频Tag Data开始的:
- 第⼀个字节包含视频数据的参数信息,
- 第⼆个字节开始为视频流数据。
第⼀个字节包含视频信息,格式如下:
Field | Type | Comment |
---|---|---|
帧类型 | UB4 | 1: 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 |
编码ID | UB4 | 使用哪种编码类型: 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 |
第⼆个字节开始为视频数据 |
Field | Type | Comment |
---|---|---|
视频数据 | 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 对应的视频帧合成时间偏移。 - 其他情况下(
AVCPacketType
为0
或2
),该字段值为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
基础字段
字段名称 | 字节数 | 说明 |
---|---|---|
configurationVersion | 1 | 配置版本,通常为 1 。 |
AVCProfileIndication | 1 | 指示 H.264 Profile(如 0x66 表示 Baseline Profile)。 |
profile_compatibility | 1 | 兼容性标识。 |
AVCLevelIndication | 1 | 指示 H.264 Level(如 0x1E 表示 Level 3.1)。 |
lengthSizeMinusOne | 1 | NALU 长度字段的字节数减 1(如 3 表示 NALU 长度用 4 字节存储)。 |
numOfSequenceParameterSets | 1 | SPS 的数量,通常为 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)和…...
华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调…...
华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《统计匹配…...
4.16学习总结
完成134. 加油站 - 力扣(LeetCode)算法题 学习了filewriter的相关方法,了解了字符流的底层原理...
java面试篇 4.9
目录 mybatis: 1、mybatis的执行流程 2、mybatis是否支持延迟加载? 当我们需要去开启全局的懒加载时: 3、mybatis的一级和二级缓存 微服务 1、springcloud五大组件有哪些 2、服务注册和发现是什么意思?springcloud如何实现…...
子函数嵌套的意义——以“颜色排序”为例(Python)
多一层缩进精减参数传递,参数少平铺书代码写更佳。 笔记模板由python脚本于2025-04-16 11:52:53创建,本篇笔记适合喜欢子函数嵌套结构代码形式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅…...
Python深度学习实现验证码识别全攻略
放在前面 Python深度学习实现验证码识别全攻略 Python深度学习实现验证码识别全攻略 在网络安全领域,验证码作为人机区分的关键防线,广泛应用于登录、注册等场景。随着技术演进,验证码样式愈发复杂,传统识别手段力不从心&#…...
【Linux】su、su-、sudo、sudo -i、sudo su - 命令有什么区别?分别适用什么场景?
目录 su su- sudo sudo -i sudo su - /etc/sudoers su 该命令将启动非登录shell,即虽然以该用户身份启动shell,但使用的是原始用户的环境设置。普通用户账户运行 su 命令切换到另一用户账户,需提供要切换的账户的密码。root用户&…...
算法-同余原理
在计算n个数相加或者相乘再取余时,中间结果可能会溢出导致结果错误,这时可以使用同余原理 一、同余原理 ①加法同余 (a[1] a[2] ... a[n])% m > (a[1] % m a[2] % m ... a[n] % m) % m ② 乘法同余 (…...
深入理解卷积神经网络(CNN):从原理到实践
引言 卷积神经网络(Convolutional Neural Networks, CNN)是深度学习领域最具影响力的架构之一,尤其在计算机视觉任务中表现出色。自2012年AlexNet在ImageNet竞赛中一战成名以来,CNN不断演进,推动着图像识别、医疗影像分析、自动驾驶等领域的快…...
深度学习常见模块实现001
文章目录 1.学习目的2.常见模块使用与实现2.1 ResNet18实现2.2 SeNet模块2.3 CBAM模块 1.学习目的 深度学习在图像处理这块,很多模块已经成型,并没有很多新的东西,更多的是不同的模块堆叠,所以需要我们不断总结,动手实…...
Python实现贪吃蛇三
上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本。后面第二篇文章Python实现贪吃蛇二修改了一些不足,但最近发现还有两点需要优化: 1、生成食物的时候有概率和记分牌重合 2、游戏缺少暂停功能 先看生成食物的时候有概率和记分牌重合的…...
windows server C# IIS部署
1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 说明:自带的是.net 4.5 不需要安装.net 3.5 尽量使用 windows server 2019、2016高版本,低版本会出现需要打补丁的问题 2、打开IIS 3、打开iis应用池 .net 4.5 4、添…...
LLM小白自学笔记:1.两种指令微调
一、LoRA 简单来说,LoRA不直接调整个大模型的全部参数(那样太费资源),而是在模型的某些层(通常是注意力层)加个“旁路”——两个小的矩阵(低秩矩阵)。训练时只更新这俩小矩阵&#x…...
杰弗里·辛顿:深度学习教父
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 杰弗里辛顿:当坚持遇见突破,AI迎来新纪元 一、人物简介 杰弗…...
RHCE 第一次作业
一.定义延迟任务 1.安装邮件服务 [roothaiou ~]# yum install s-nail -y 2.配置邮件服务 [roothaiou ~]# vim /etc/mail.rc 3.测试邮件服务 [roothaiou ~]# echo 88888888 | mail -v -s Passion 13571532874163.com 4.设置定时任务 [roothaiou ~]# crontab -e 二.时间同步…...
库洛游戏一面+二面
目录 一面 1. ArrayList和LinkedList的区别,就是我在插入和删除的时候他们在时间复杂度上有什么区别 2. hashmap在java的底层是怎么实现的 3. 红黑树的实现原理 4. 红黑树的特点 5. 为什么红黑树比链表查询速度快 6. 在java中字符串的操作方式有几种 7. Stri…...
基于多模态深度学习的亚急性脊髓联合变性全流程预测与个性化管理技术方案
目录 技术方案文档1. 数据收集与预处理模块2. 多模态预测模型构建3. 术前风险评估系统4. 术中实时监测系统5. 术后并发症预测与护理6. 统计分析与验证模块7. 健康教育系统技术实现说明技术方案文档 1. 数据收集与预处理模块 功能:构建数据管道,清洗并整合多源数据 伪代码示…...
蓝桥杯日期的题型
做题思路 一般分为3个步骤,首先要定义一个结构体来存储月份的天数,第一循环日期,第二判断日期是否为闰年,第三就是题目求什么 结构体 static int[] ds{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 判断是否闰年的函数 public static void f(int m,int d){//被4整…...
【树形dp题解】dfs的巧妙应用
【树形dp题解】dfs的巧妙应用 [P2986 USACO10MAR] Great Cow Gathering G - 洛谷 题目大意: Bessie 正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。 每个奶牛居住在 N N …...
《AI大模型应知应会100篇》第20篇:大模型伦理准则与监管趋势
第20篇:大模型伦理准则与监管趋势 摘要 随着人工智能(AI)技术的飞速发展,尤其是大模型(如GPT、PaLM等)在自然语言处理、图像生成等领域的广泛应用,AI伦理问题和监管挑战日益凸显。本文将梳理当…...
线上教学平台(vue+springboot+ssm+mysql)含文档+PPT
线上教学平台(vuespringbootssmmysql)含文档PPT 该系统是一个在线教学平台,主要分为管理员和学员两个角色;管理员界面包含首页、交流中心、学员管理、资料类型管理、学习资料管理、交流论坛、我的收藏管理、留言板管理、考试管理…...
Being-0:具有视觉-语言模型和模块化技能的人形机器人智体
25年3月来自北大、北京智源和 BeingBeyond 的论文“Being-0: A Humanoid Robotic Agent with Vision-Language Models and Modular Skills”。 构建能够在现实世界具身任务中达到人类水平表现的自主机器人智体,是人形机器人研究的终极目标。近期,基于基…...
Fiddler 进行断点测试:调试网络请求
目录 一、什么是断点测试? 二、Fiddler 的断点功能 三、如何在 Fiddler 中设置断点? 步骤 1:启动 Fiddler 步骤 2:启用断点 步骤 3:捕获请求 步骤 4:修改请求或响应 四、案例:模拟登录失…...
决策树:ID3,C4.5,CART树总结
树模型总结 决策树部分重点关注分叉的指标,多叉还是单叉,处理离散还是连续值,剪枝方法,以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…...
DDS信号发生器设计
一、基本概述 1.1 DDS简介 DDS信号发生器即直接数字频率合成(Direct Digital Frequency Synthesis,简称DDS)是一种利用数字技术生成信号的方法。它通过数字信号处理技术,将数字信号转换为模拟信号,从而生成高质量的正…...
23黑马产品经理Day01
今天过了一遍23黑马产品经理的基础视频 问题思考维度 抓住核心用户 为什么需要抓住核心用户? 主要原因:用户越来越细分,保持市场竞争力,产品开发推广更聚焦 做产品为什么要了解用户:了解用户的付费点,…...
18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建
学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层: 接口层&#…...
东方潮流亮相广州益民艺术馆|朋克编码“艺术家潮玩”系列开幕引爆热潮
4月15日,由我的宇宙旗下公司朋克编码携“艺术家潮玩”系列亮相广州白云益民艺术馆,标志着其全国文化推广计划正式启航。本次展览围绕“潮玩艺术东方文化”展开,融合传统文化与当代潮流,以年轻化方式赋能中国文化出海。 展览现场潮…...
充电宝项目:规则引擎Drools学习
文章目录 规则引擎 Drools1 问题2 规则引擎概述2.1 规则引擎2.2 使用规则引擎的优势2.3 规则引擎应用场景2.4 Drools介绍 3 Drools入门案例3.1 创建springboot项目 引入依赖3.2 添加Drools配置类3.4 创建实体类Order3.5 orderScore.drl3.6 编写测试类 4 Drools基础语法4.1 规则…...
C++零基础实践教程 文件输入输出
模块八:文件输入输出 (数据持久化) 在之前的模块中,我们学习了如何使用程序处理数据。然而,当程序结束运行时,这些数据通常会丢失。数据持久化 (Data Persistence) 指的是将程序中的数据存储到非易失性存储介质(如硬盘…...
SpringAI+DeepSeek大模型应用开发——1 AI概述
AI领域常用词汇 LLM(LargeLanguage Model,大语言模型) 能理解和生成自然语言的巨型AI模型,通过海量文本训练。例子:GPT-4、Claude、DeepSeek、文心一言、通义干问。 G(Generative)生成式: 根据上…...
数据中台进化史:从概念萌芽到价值变现的蜕变之路
在数字化转型的浪潮中,数据中台已成为企业驾驭数据、驱动业务创新的关键力量。回顾数据中台的发展历程,犹如一场从混沌到有序、从萌芽到成熟的精彩蜕变,它由湖仓一体、数据治理平台、数据服务平台三大核心要素逐步构建而成,每一个…...
【Java学习笔记】运算符
运算符 运算符的类型 算数运算符 赋值运算符 关系运算符(比较哦啊运算符) 逻辑运算符 三元运算符 位运算符(需要二进制基础) 一、算数运算符 运算符计算范例结果正号77-负号b11; -b-11加法9918-减法10-82*乘法7*856/除法9…...
【python】OpenCV—Tracking(10.6)—People Counting
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考来自 更多有趣的代码示例,可参考【Programming】 1、功能描述 借助 opencv-python,用 SSD 人形检测模型和质心跟踪方法实现对人群的计数 基于质心的跟踪可以参考 【pyt…...
JavaSE学习(前端初体验)
文章目录 前言一、准备环境二、创建站点(创建一个文件夹)三、将站点部署到编写器中四、VScode实用小设置五、案例展示 前言 首先了解前端三件套:HTML、CSS、JS HTML:超文本标记语言、框架层、描述数据的; CSS…...
智慧城市像一张无形大网,如何紧密连接你我他?
智慧城市作为复杂巨系统,其核心在于通过技术创新构建无缝连接的网络,使物理空间与数字空间深度融合。这张"无形大网"由物联网感知层、城市数据中台、人工智能中枢、数字服务入口和安全信任机制五大支柱编织而成,正在重塑城市运行规…...
Linux常用命令
一、history 用于显示历史命令。 history 10显示最近10条历史命令。!200使用第200行的指令。history -c清空历史记录。 二、pwd 用于显示当前绝对路径。 pwd显示当前绝对路径。 三、ls 用于以行的形式显示当前文件夹下所有内容。 ls -a显示所有内容,包括隐藏文…...
【AI】SpringAI 第二弹:接入 DeepSeek 官方服务
一、接入 DeepSeek 官方服务 通过一个简单的案例演示接入 DeepSeek 实现简单的问答功能 1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2…...
QT的信号槽的直接触发,队列触发,自动触发
在Qt中,信号槽机制是一个非常强大的特性,它用于实现对象之间的通信。除了默认的直接触发方式之外,Qt还提供了队列触发等不同的触发方式。 1. 直接触发(Direct Connection) 直接触发是最常见的连接方式,信…...
typescript html input无法输入解决办法
input里加上这个: onkeydown:(e: KeyboardEvent) > {e.stopPropagation();...
工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台
安科瑞顾强 政策背景与“双碳”战略驱动 2025年《政府工作报告》明确提出“单位国内生产总值能耗降低3%左右”的目标,要求通过产业结构升级(如高耗能行业技术革新或转型)、能源结构优化(提高非化石能源占比)及数字化…...
栅格数据处理
一、栅格数据的引入与基本操作 (一)加载栅格数据 在 ArcPy 中,栅格数据可以通过 arcpy.Raster 类来加载。例如,如果你有一个存储在本地路径下的栅格数据文件(如 GeoTIFF 格式),可以这样加载&a…...
C语言文件操作
本文重点: 什么是文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 文件结束的判定 什么是文件 磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件 程序文件 包括源程序文…...
毛笔书体检测-hog+svm python opencv源码
链接:https://pan.baidu.com/s/1l-bw8zR9psv1HycmMqQBqQ?pwd2ibp 提取码:2ibp --来自百度网盘超级会员V2的分享 1、毛笔字检测运行流程 如果解压文件发现乱码,可以下载Bandizip 解压文件 数据集在百度网盘里面 将文件名字改成images c…...
基于YOLOV11的道路坑洼分析系统
基于YOLOV11的道路坑洼分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】图形化界面与实时检测统计可视化功能 【技术栈】 ①:系统环境:Windows/MacOS/Linux多平台支持,推荐NVIDIA GPU加速 ②…...
【系统搭建】DPDK安装配置与helloworld运行
一,安装相关依赖 1. 安装依赖 sudo apt update && sudo apt install -y \build-essential libnuma-dev meson ninja-build pciutils#安装Python3与PIP3 sudo apt install python3-pip2. 升级 pip 和 setuptools sudo apt install python3-pip python3-de…...
Distortion, Animation Raymarching
这节课的主要目的是对uv进行操作,实现一些动画的效果,实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…...
架构风格(高软59)
系列文章目录 架构风格 文章目录 系列文章目录前言一、架构风格定义?二、架构风格分类总结 前言 本节讲明架构风格知识点。 一、架构风格定义? 二、架构风格分类 总结 就是高软笔记,大佬请略过!...
免费使用RooCode + Boomerang AI + Gemini 2.5 Pro开发套件
若您正在寻找利用免费AI工具简化应用开发的方法,这份指南将为您揭开惊喜。 我们将详解如何免费整合RooCode、Boomerang AI智能代理与Google Gemini 2.5 Pro API,在Visual Studio Code中实现自动化编程加速。 这套方案能让您在几分钟内从创意跃迁至可运行原型。 套件构成与…...