FLV 与 MP4 格式深度剖析:结构、原理
1 FLV格式分析
1.1 定义
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。
1.2 FLV Header
FLV头占9个字节,⽤来标识⽂件为FLV类型,以及后续存储的⾳视频流。⼀个FLV⽂件,每种类型的tag都属于⼀个流,也就是⼀个flv⽂件最多只有⼀个⾳频流,⼀个视频流,不存在多个独⽴的⾳视频流在⼀个⽂件的情况。
字段 | 长度 | 说明 |
---|---|---|
签名 | 3 字节 | 固定为 “F”“L”“V”,对应十六进制 0x46、0x4C、0x56,是 FLV 文件重要标识 |
版本 | 1 字节 | 如 0x01 代表 FLV 版本 1,助程序明确格式规范并采用对应解析策略 |
保留字段 | 5 位 | 前 5 位必须为 0,为未来格式扩展预留 |
音频流标识 | 1 位 | 1 表示文件含音频数据,0 表示无音频流 |
保留字段 | 1 位 | 值为 0,为后续功能扩展预留 |
视频流标识 | 1 位 | 1 代表有视频数据,0 代表无视频流 |
文件头大小 | 4 字节 | FLV 版本 1 中通常为 9,指从文件起始到文件体起始的字节数,方便未来扩展时确定文件体位置 |
1.3 FLV Body
1.3.2 Previous Tag Size
在 FLV(Flash Video)文件格式里,“Previous Tag” 指的是 FLV 文件体(FLV Body)中,当前 Tag 之前的那个 Tag。为了更清晰地理解它,下面从它的含义、作用、与当前 Tag 的关联等方面详细介绍:
-
含义
在 FLV 文件的结构中,文件体由一连串的 “Previous Tag Size 字段 + Tag” 组合构成。这里的 “Previous Tag” 就是前一个完整的 “Tag”,它包含了自己的 Tag Header 和 Tag Data 两部分。Tag Header 一般占 11 字节,包含 Tag 类型、数据区大小、时间戳等信息;Tag Data 则是具体的音视频或脚本数据等内容。 -
作用
- 逆向读取:Previous Tag Size 字段(占 4 字节)记录了前一个 Tag 的大小。借助这个信息,程序能够从文件末尾逆向读取,逐一解析每个 Tag。这在某些场景下非常有用,比如需要快速定位到特定时间点的音视频数据时,逆向读取可以提高查找效率。
- 数据完整性检查:通过比较 Previous Tag Size 字段记录的大小和实际解析出的前一个 Tag 的大小,能够验证数据的完整性。如果两者不一致,可能意味着文件在传输或存储过程中出现了损坏。
-
与当前 Tag 的关联
在文件中,每个 Tag 前面都有一个 Previous Tag Size 字段,它指向当前 Tag 的前一个 Tag。通过这种方式,文件中的各个 Tag 形成了一个类似链表的结构,程序可以按顺序依次解析每个 Tag。例如,在解析当前 Tag 时,通过读取它前面的 Previous Tag Size 字段,就可以知道前一个 Tag 的大小,从而正确定位到前一个 Tag 的起始位置进行解析。
示例说明
假设 FLV 文件体中有连续的两个 Tag:Tag1 和 Tag2。在解析 Tag2 时,会先读取 Tag2 前面的 Previous Tag Size 字段,这个字段的值就是 Tag1 的大小。通过这个值,程序可以准确找到 Tag1 的起始位置,进而对 Tag1 进行解析。如果 Tag1 的大小是 500 字节,那么 Previous Tag Size 字段的值就是 500(以字节为单位)。
1.3.2 FLV Tag
每⼀个Tag也是由两部分组成**:tag header和tag data**。Tag Header⾥存放的是当前tag的类型、数据区(tag data)的⻓度等信息。
Tag Header
字段 | 类型 | 说明 |
---|---|---|
Tag类型 | UI8 | 8表示音频,9表示视频,18表示脚本数据,其他值为预留未用 |
数据区大小 | UI24 | 当前tag数据域大小,不包含tag header |
时间戳Timestamp | UI24 | 当前帧时戳,单位毫秒,相对值,首个tag时戳为0 |
时戳扩展字段TimestampExtended | UI8 | 时戳大于0xFFFFFF时使用,为高8位,与低24位组成完整时戳 |
StreamID | UI24 | 始终为0 |
数据域 | UI[8*n] | 存放tag实际数据,字节数由“数据区大小”决定 |
Script Tag Data(脚本数据)
Script Tag Data 也被称为 MetaData Tag,通常作为 FLV 的第一个 Tag 且只有一个,用于存放 FLV 视频和音频的元信息,如 duration(时长)、width(宽度)、height(高度) 等 。其结构由两个 AMF 包组成,具体如下:
第一个 AMF 包
- 包类型标识:占1字节,一般总是0x02 ,代表字符串类型 。
- 字符串长度:占2字节(UI16类型 ),一般总是0x000A ,即表示字符串“onMetaData”的长度 。
- 字符串内容:后续字节为具体字符串,一般为“onMetaData” ,对应的十六进制为6F,6E,4D,65,74,61,44,61,74,61 。 这个包主要用于标识后续数据是关于元信息的描述。
第二个 AMF 包
- 包类型标识:第1个字节表示AMF包类型,一般总是0x08 ,代表数组类型 。
- 数组元素个数:第2 - 5个字节为UI32类型值 ,用于表示数组元素的数量 。
- 数组元素内容: 后续是各数组元素的封装,每个数组元素由元素名称和值组成 。具体表示为:
- 元素名称长度:用2字节(UI16)表示元素名称的长度,假设为L 。
- 元素名称:接着是长度为L的字符串,即元素名称 。
- 元素值类型:第L + 3个字节表示元素值的类型 。
- 元素值:再后面是对应的值,占用字节数取决于值的类型 。
常见的数组元素及对应含义如下:
元素名称 | 含义 | 示例值 |
---|---|---|
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 ) |
在 FLV 文件的视频 Tag 中,Timestamp(3 字节 )和 TimestampExtended(1 字节 )共同构成解码时间戳(DTS),单位为 ms ;CompositionTime 表示显示时间戳(PTS)相对于解码时间戳(DTS)的偏移值 ,位于每个视频 tag 的第 14 - 16 字节 ,通过 “显示时间 (pts) = 解码时间(tag 的第 5 - 8 字节) + CompositionTime” 公式来计算最终用于播放显示的时间,从公式及相关原理可知,其单位与其他时间参数统一,为 ms 。
Script data脚本数据就是描述视频或⾳频的信息的数据,如宽度、⾼度、时间等等,⼀个⽂件中通常只有⼀个元数据,⾳频tag和视频tag就是⾳视频信息了,采样、声道、频率,编码等信息。
Audio Tag Data结构(⾳频类型)
⾳频Tag Data区域开始的:
- 第⼀个字节包含了⾳频数据的参数信息,
- 第⼆个字节开始为⾳频流数据。
第⼀个字节为⾳频的信息
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信息)
-
若AACPacketType为0 ,表示这部分数据是AAC sequence header ,存放的是AudioSpecificConfig结构(在“ISO - 14496 - 3 Audio”中有相关描述 ),属于音频配置信息,用于告知解码器如何解码后续的AAC音频数据。
-
若AACPacketType为1 ,则第二个字节开始直接就是AAC原始帧数据(Raw AAC frame data ),可直接进行解码播放等处理 。 对于其他非AAC格式的音频,这部分数据则依据其对应的音频格式规范进行组织和存储 。
AAC 原始帧数据(Raw AAC frame data )
- 定义:指经过 AAC 编码后,未添加额外传输或配置相关头部信息的纯粹音频编码数据 。它是 AAC 音频内容的核心部分,包含了实际用于还原声音的编码采样点等信息 。
- 作用:是音频解码的直接对象,解码器根据 AAC 编码规则对其进行处理,将编码数据转换为可播放的音频信号 。但单独的原始帧数据缺少一些播放控制和格式说明等关键信息,通常不能直接被播放器识别播放
Video Tag Data结构(视频类型)
- 第⼀个字节包含视频数据的参数信息,
- 第⼆个字节开始为视频流数据:
这张表格介绍了FLV格式中视频标签(Video Tag)相关结构:
视频标签首字节结构
字段 | 类型 | 说明 |
---|---|---|
帧类型 | UB4 | 用4位无符号整数表示。1代表关键帧(对于AVC编码,等同于h264的IDR帧,可用于随机访问 );2代表普通帧(对于AVC编码,是不可随机访问的帧 );3是仅H.263有的可丢弃普通帧 ;4是仅供服务器使用的生成关键帧 ;5是视频信息/命令帧 。 |
编码ID | UB4 | 用4位无符号整数表示编码类型。1为JPEG(目前未使用 );2是Sorenson H.263 ;3是Screen video ;4是On2 VP6 ;5是带alpha通道的On2 VP6 ;6是Screen video version 2 ;7是AVC 。 |
视频流数据
视频标签首字节之后是视频数据部分,视频数据的结构根据编码ID不同而有差异:
条件 | 视频数据结构 |
---|---|
If CodecID == 2 | H263VIDEOPACKET |
If CodecID == 3 | SCREENVIDEOPACKET |
If CodecID == 4 | VP6FLVIDEOPACKET |
If CodecID == 5 | VP6FLALPHAVIDEOPACKET |
If CodecID == 6 | SCREENV2VIDEOPACKET |
If CodecID == 7(AVC格式 ) | AVCVIDEOPACKET ,后续结构会根据AVC编码规范进一步细分,用于存储视频的具体编码数据 。 |
1.4 总结
2 MP4
2.1 MP4 结构
MP4 文件格式基础
MP4 文件格式,正式名称为 MPEG-4 Part 14,源自 MPEG-4 标准第 14 部分。它是一种多媒体格式容器,就像是一个多功能的收纳盒,可以把视频、音频数据流、海报、字幕以及元数据等各种多媒体元素整合在一起。当下流行的视频编码格式 AVC/H264 就定义在 MPEG-4 Part 10 中,这也从侧面反映了 MP4 格式强大的兼容性和广泛的应用场景。而且,MP4 文件格式是基于 Apple 公司的 QuickTime 格式发展而来的,所以 QuickTime File Format Specification 是研究 MP4 的重要参考资料。
MP4 文件的基本结构 ——Box 的世界
MP4 文件的基本组成单元是 Box,整个文件就像是由各种各样 Box 搭建起来的 “积木城堡”,这些 Box 有父 Box,也有子 Box,它们相互嵌套,形成了复杂而有序的结构。每个 Box 都分为 Header 和 Data 两部分,Header 部分包含 Box 的类型和大小信息,Data 部分则存放着子 Box 或者具体的数据。
比如,在一个典型的 MP4 文件中,常见的 Box 有 ftyp、moov、mdat 等。ftyp Box 一般位于文件开头,它描述了文件的版本、兼容协议等信息,就像是文件的 “身份铭牌”;moov Box 则包含了文件中所有媒体数据的宏观描述信息以及每路媒体轨道的具体信息,是文件的 “信息中枢”;mdat Box 用于存放具体的媒体数据,是文件的 “数据仓库”。
2.2 深入解析关键 Box
在多媒体技术领域,MP4 文件是最常见的存储格式之一。它能将视频、音频、字幕等多种媒体元素整合在一起,实现流畅播放。而这一切的实现,都依赖于其独特的文件结构。MP4 文件采用 “Box” 的嵌套结构来组织数据,每个 Box 都有特定的功能和作用。接下来,我们就对 MP4 文件结构中重要的部分一一进行讲解,并通过示例加深理解。
一、根层级:moov Box
moov Box 是 MP4 文件的 “总指挥部”,存放着整个文件的媒体元数据,几乎所有与媒体轨道相关的关键信息都包含在其内部。它就像是一本书的目录和前言,记录了这本书的整体信息以及各个章节的概要。
moov Box 主要包含两个关键子 Box:
- mvhd(Movie Header Box):记录全局媒体信息,包括文件的创建时间、修改时间、时间度量标尺(time_scale)、可播放时长等。其中,time_scale是一个非常重要的参数,它定义了时间的基本单位,即 1 秒包含多少个时间刻度。例如,若time_scale为 90000,就表示 1 秒被划分为 90000 个时间刻度。假设一个视频的时长记录为 900000 个刻度,通过计算(900000÷90000),我们就能知道这个视频的时长是 10 秒 。mvhd中的信息是音视频共用的,为整个文件提供了时间基准。
- trak(Track Box):每个moov Box 中可以包含多个trak,每个trak对应一路独立的媒体轨道,比如一路视频、一路音频,或者一路字幕。以常见的电影视频文件为例,可能会有一个视频轨道用于呈现画面,多个音频轨道用于提供不同语言的配音,以及多个字幕轨道用于显示不同语言的字幕。
二、轨道层级:trak Box
trak Box 是媒体轨道的 “专属档案袋”,它内部的结构详细描述了对应媒体轨道的各项属性和数据信息。我们以视频轨道和音频轨道为例进行说明。
(一)tkhd(Track Header Box)
tkhd用于定义轨道的基础属性,虽然音频轨道和视频轨道都会用到它,但具体参数有所不同。 - 视频轨道:包含视频画面的宽度、高度(单位为像素,例如width=1920,height=1080,表示该视频是 1080P 高清视频)、旋转角度(如果视频有旋转效果,会在这里记录旋转角度信息)等视觉相关信息。
- 音频轨道:侧重于记录采样率(如 44100Hz,表示每秒采集 44100 个音频样本)、声道数(单声道为 1,立体声为 2)、音频时长等声学特性参数 。
(二)mdia(Media Box)
mdia Box 是媒体数据的 “信息中心”,它内部包含了mdhd、hdlr和minf等重要子 Box ,从不同方面对媒体数据进行描述和管理。 - mdhd(Media Header Box):主要存储轨道媒体的时间信息,和mvhd中的时间信息相互配合。其中同样包含time_scale参数,并且还记录了轨道的时间偏移等信息。例如,视频轨道和音频轨道可能会因为编码或制作的原因,在时间上存在微小的偏移,mdhd就可以记录这些偏移量,确保音视频在播放时能够准确同步 。
- hdlr(Handler Box):指定处理媒体数据的处理器类型,它就像是媒体数据的 “专属翻译”。对于视频流,其handler type可能为 “vide”,表明该视频数据需要由视频解码器来处理;对于音频流,handler type可能是 “soun”,意味着要使用音频解码器来处理此音频数据 。
- minf(Media Information Box):承载着媒体数据解析所需的核心信息,其中最重要的子 Box 是stbl(Sample Table Box),它负责管理媒体样本的索引、时长、位置等重要元数据。此外,minf还包含dinf(Data Information Box),用于提供媒体数据的来源信息,比如数据是存储在本地文件,还是通过网络传输获取 。
三、样本管理核心:stbl Box 及其子 Box
stbl Box 是 MP4 文件中媒体样本管理的 “核心数据库”,它包含的多个子 Box 协同工作,实现对媒体样本的精准定位和高效访问。
(一)stsd(Sample Description Box)
stsd详细描述了每个媒体样本(如音频帧或视频帧)的编码格式、尺寸、采样率等关键信息。例如,对于一个 H.264 编码的视频,stsd中会指明编码类型为 “avc1”,并包含 SPS(序列参数集)和 PPS(图像参数集)等编码器配置信息,这些信息是解码器正确解码视频的关键;对于 AAC 编码的音频,stsd会说明编码格式为 “mp4a”,同时给出采样率、声道数等参数 。
(二)stts(Time to Sample Box)
stts建立了时间与媒体样本之间的映射关系,以时间戳的形式记录每个样本的持续时间。在一个视频文件中,不同的视频帧可能由于编码方式、内容复杂度等因素,持续时间并不相同。例如,一个视频中,前 10 帧的持续时间可能都是 3 个时间刻度,接下来的 5 帧持续时间为 5 个时间刻度,stts就会精确记录这些信息,播放器根据这些记录就能知道每个视频帧在时间轴上的位置和持续时长,从而实现视频的准确播放 。
(三)stsc(Sample to Chunk Box)
stsc将媒体样本组织成块(chunk),定义了每个块包含多少个样本,以及每个块在文件中的起始样本编号。在 MP4 文件中,媒体数据通常不会以单个样本的形式存储,而是多个样本组成一个块进行存储。比如,可能每 10 个视频帧组成一个 chunk,stsc就会记录每个 chunk 包含 10 个样本,以及每个 chunk 对应的起始样本编号,这样可以提高数据读取和处理的效率 。
(四)stco(Chunk Offset Box)
stco记录了每个块在文件中的偏移位置。结合stsc提供的块与样本的关系信息,播放器就能快速准确地从文件中定位并读取特定的媒体块。例如,当用户在视频播放过程中拖动进度条时,播放器会根据stco和stsc提供的信息,迅速找到对应时间点的媒体块并开始播放,实现流畅的随机访问 。
2.3 综合示例
假设我们有一个简单的 MP4 视频文件,它包含一路视频轨道和一路音频轨道。打开这个文件,在moov Box 中,mvhd记录了文件的创建时间为 2024 年 1 月 1 日,time_scale为 90000,总时长为 1800000 个刻度(即 20 秒);trak中有两个,分别对应视频和音频轨道。
在视频轨道的tkhd中,记录了视频的宽度为 1280 像素,高度为 720 像素;mdia中的hdlr指定了视频的处理器类型为 “vide”;stbl中的stsd表明视频采用 H.264 编码,stts记录了每个视频帧的持续时间,stsc和stco则帮助播放器定位和读取视频数据块。
音频轨道的tkhd记录了采样率为 44100Hz,声道数为 2;mdia中的hdlr指定音频的处理器类型为 “soun”;stbl中的stsd说明了音频采用 AAC 编码,同样通过stts、stsc和stco实现对音频样本的管理和访问 。
相关文章:
FLV 与 MP4 格式深度剖析:结构、原理
1 FLV格式分析 1.1 定义 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv FLV封装格式是由⼀个**⽂件…...
k8s的yaml文件里的volume跟volumeMount的区别
volume 是 Pod 级别的资源,用于定义存储卷。它是一个独立于容器的存储资源,可以被一个或多个容器共享使用。volume 的定义位于 Pod 的 spec.volumes 部分。 特点 独立性:volume 是 Pod 的一部分,而不是容器的一部分。它独立于容…...
Git常用操作命令
配置 Git git config --global user.name "Your Name": 设置用户名。git config --global user.email "your_emailexample.com": 设置用户邮箱。 初始化和克隆仓库 git init: 初始化一个新的 Git 仓库。git clone [URL]: 克隆一个远程仓库到本地。 git cl…...
09.传输层协议 ——— TCP协议
文章目录 TCP协议 谈谈可靠性TCP协议格式 序号与确认序号窗口大小六个标志位 确认应答机制(ACK)超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…...
NineData 与飞书深度集成,企业级数据管理审批流程全面自动化
NineData 正式推出与飞书审批系统的深度集成功能,企业用户在 NineData 平台发起的审批工单,将自动推送至审批人的飞书中,审批人可以直接在飞书进行审批并通过/拒绝。该功能实现跨系统协作,带来巨大的审批效率提升,为各…...
WebRTC服务器Coturn服务器中的通信协议
1、概述 作为WebRTC服务器,coturn通信协议主要是STUN和TURN协议 STUN&TURN协议头部都是20个字节,用 Message Type来区分不同的协议 |------2------|------2------|------------4------------|------------------------12-------------------------|-----------…...
4.19除自身以外数组的乘积
我自己的思路,想用双指针, 一个从左边left开始乘,一个从右边right开始乘,如果left,或者right遇到了目标索引i(也就是我们要跨过去的当前元素),那么直接让对应的指针加一,当前元素不参与累积的计算ÿ…...
Anaconda3使用conda进行包管理
一、基础包管理操作 安装包 使用 conda install <包名> 安装指定包,支持多包批量安装和版本指定: conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...
媒体关注:联易融聚焦AI+业务,重塑供应链金融生态
近日,供应链金融科技龙头企业联易融科技集团(以下简称“联易融”)发布的公告显示,截至2024年末,公司现金储备达51亿元,同比上一年增加2亿元。公司称,公司经营性现金流保持健康,现金储…...
安装 Conda 环境
安装 Conda 环境:快速指南 什么是 Conda? Conda 是一个开源的跨平台包管理器和环境管理系统,支持 Python、R、Julia 等语言。它广泛用于数据科学和机器学习领域,能够轻松创建、管理和切换开发环境。 安装步骤 1. 安装 Anaconda…...
Qt Creator 创建 Qt Quick Application一些问题
一、Qt Creator 创建 Qt Quick Application 时无法选择 MSVC 编译器(即使已安装 Qt 5.15.2 和 MSVC2019) 1、打开 Qt Creator 的编译器设置 工具 (Tools) → 选项 (Options) → Kits → 编译器 (Compilers) 检查是否存在 Microsoft Visual C++ Compiler (x86_amd64) 或类似条…...
Spark-Streaming核心编程
以下是今天所学的知识点与代码测试: Spark-Streaming DStream实操 案例一:WordCount案例 需求:使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数 实验步骤:…...
深度剖析神经网络:从基础原理到面试要点(二)
引言 在人工智能蓬勃发展的今天,神经网络作为其核心技术之一,广泛应用于图像识别、自然语言处理、语音识别等众多领域。深入理解神经网络的数学模型和结构,对于掌握人工智能技术至关重要。本文将对神经网络的关键知识点进行详细解析…...
c#操作excel
说明 vs2022开发,调用excel 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Sy…...
MQTTX + MCP:MQTT 客户端秒变物联网 Agent
引言:MQTTX 与 MCP 的融合 作为最受欢迎的 MQTT 客户端工具,MQTTX 在 1.12.0 beta 版本中集成了模型上下文协议(MCP)到 Copilot AI 功能中,显著提升了服务能力。这一融合让 MQTTX 转变为 MCP Host(也就是发…...
GSAP 动画引擎实战:打造丝滑动效交互组件库
目录 一、前言二、项目初始化三、核心动效组件实战1. 元素淡入组件:FadeIn.vue2. 列表级联动画:SlideList.vue3. 滚动触发 Reveal 动画:ScrollReveal.vue4. 拖拽盒子组件:DraggableBox.vue5. 打字机效果组件:Typewrite…...
[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导
一、简介 本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式 f r l a m b e r t i a n c d i f f π fr_{lambertian}\frac{c_{diff}}{\pi} frlambertianπcdiff的推导。 二、漫反射项 根据 渲染方程: L o ( v ) ∫ …...
网易云音乐如何修改缓存地址到D盘
你可以通过创建 符号链接(Symbolic Link) 将网易云音乐的缓存目录转移到D盘,无需修改软件设置。以下是具体步骤: 操作步骤 关闭网易云音乐 确保程序完全退出(任务栏右下角无残留进程)。 备份并移动原缓存文…...
react使用01
React.cloneElement(element,props,…children) 这个是React的官方API,,主要用于克隆并修改React元素,, 本质: 复制一个已有的React元素,并允许你修改他的props element : 必须是一个有效的element元素p…...
yooAsset打包后材质丢失
以安卓为目标平台打出的AssetBundle包(尤其是YooAsset打出的),在Window下Unity编辑器以HostPlayMode运行,有时显示会丢失部分材质。 这是因为安卓目标的AssetBundle包适合OpenglES,而window下Unity编辑器模式是Dx11&a…...
Codeforces Round 1019 (Div. 2)
A. Common Multiple 找不同的数字 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int t; cin >> t;while (t--) {int n;cin >> n;vector<int> a(n);for (int i 0; i < n; i)cin >&…...
【Spring Boot】MyBatis多表查询的操作:注解和XML实现SQL语句
1.准备工作 1.1创建数据库 (1)创建数据库: CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;(2)使用数据库 -- 使⽤数据数据 USE mybatis_test;1.2 创建用户表和实体类 创建用户表 -- 创建表[⽤⼾表…...
Docker离线安装与配置指南
Docker离线安装与配置指南 离线安装步骤 1. 下载离线安装包 官方下载地址: https://download.docker.com/linux/static/stable/x86_64/注意:国内用户若无法访问,可能需要使用科学上网工具。本文档以Docker 20.10.23版本为例。 2. 安装与部…...
N8N 官方 MCP 节点实战指南:AI 驱动下的多工具协同应用场景全解析
在低代码自动化领域,N8N 凭借其强大的节点扩展能力和灵活的工作流编排,成为企业构建复杂自动化流程的首选工具。随着 AI Agent 技术的兴起,通过 MCP(Multi-Tool Coordination Protocol)实现 AI 与外部工具的协同调用&a…...
v-html 显示富文本内容
返回数据格式: 只有图片名称 显示不出完整路径 解决方法:在接收数据后手动给img格式的拼接vite.config中的服务器地址 页面: <el-button click"">获取信息<el-button><!-- 弹出层 --> <el-dialog v-model&…...
UWB与GPS技术融合的室内外无缝定位方案
一、技术原理与互补性 双模定位机制 室外场景:GPS/北斗提供10-30厘米级定位精度(RTK技术辅助),覆盖露天区域。室内场景:UWB通过TOF/TDOA算法实现10-50厘米级定位精度,穿透金…...
AiEditor v1.3.8 发布
2025 年 4 月 22 日,AI 富文本编辑器 AiEditor 发布了 v1.3.8 版本。 AiEditor 是一个面向 AI 的下一代富文本编辑器,基于 Web Component 开发,支持 Layui、Vue、React、Angular 等几乎任何前端框架,适配 PC Web 端和手机端&#…...
从零学会epoll的使用和原理
从零学会epoll的使用和原理 第一步:理解 select / poll 的缺陷 一、select 和 poll 是什么? 它们是 Linux 提供的 I/O 多路复用机制,可以让我们同时监听多个文件描述符(fd),比如 socket,来等…...
XHTMLConverter把docx转换html报java.lang.NullPointerException异常
一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…...
教育科技质检的三重挑战 质检LIMS系统在教育技术研发的应用
在教育技术研发领域,实验室作为产品验证的核心环节,其质检效率与数据安全性直接关乎企业的创新竞争力。LIMS(实验室信息管理系统)作为贯穿检测全流程的数字化中枢,正在成为教育科技企业的"质量守护者"。本文…...
MySQL最左前缀原则深度解析:优化索引设计的核心法则
一、什么是最左前缀原则? 最左前缀原则(Leftmost Prefix Principle) 指在使用复合索引(Composite Index)时,MySQL会按照索引定义的列顺序,从左到右匹配查询条件。只有连续且从最左侧开始的列组…...
多模态大语言模型arxiv论文略读(三十五)
On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文标题:On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文作者:Xingxuan Zhang, Jiansheng Li, Wenjing Chu, Junjia…...
Linux 安装pm2并全局可用
前言 本文基于:操作系统 CentOS Stream 8 使用工具:Xshell8、Xftp8 服务器基础环境: node - 请查看 Linux安装node并全局可用 所需服务器基础环境,请根据提示进行下载、安装。 1.安装依赖 npm install pm2 -g2.配置全局软链…...
39.剖析无处不在的数据结构
数据结构是计算机中组织和存储数据的特定方式,它的目的是方便且高效地对数据进行访问和修改。数据结构表述了数据之间的关系,以及操作数据的一系列方法。数据又是程序的基本单元,因此无论是哪种语言、哪种领域,都离不开数据结构&a…...
基于 Vue 的Tiptap 富文本编辑器使用指南
目录 🧰 技术栈 📦 所需依赖 📁 文件结构 🧱 编辑器组件实现(components/Editor.vue) ✨ 常用操作指令 🧠 小贴士 🧩 Tiptap 扩展功能使用说明(含快捷键与命令&am…...
【音视频】AAC-ADTS分析
AAC-ADTS 格式分析 AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主 要的贡献者。 ADIF:Audio Data Interchange Format ⾳…...
vue中将elementUI和echarts转成pdf文件
若要将包含 ElementUI 组件数据和多个 ECharts 图表的数据转换为 PDF 文档,可结合 html2canvas、jspdf 以及 dom-to-image 来实现。其中,html2canvas 和 dom-to-image 可将 ECharts 图表转换为图片,jspdf 则用于生成 PDF 文档。对于 ElementU…...
基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现
基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域,高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…...
本地部署DeepSeek-R1模型接入PyCharm
以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 下载安装包 访问Ollama官网(https://ollama.com/download)或通过视频提供的百度云盘链接下载对应系统的安装包。Windows用户…...
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文: Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因,引起了多学科领域的关注。分析事故严重性特…...
音视频小白系统入门课-3
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2 视频: 由一组图像组成:像素、分辨率、RGB 8888(24位) 、RGBA(32位)为…...
考研系列-计算机网络-第五章、传输层
一、传输层提供的服务 1.重点知识...
将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中
需求:关于如何将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境test2里,而且他们提到用requirements.txt 安装一直报错,所以想尝试直接拷贝的方法。 可以尝试通过直接拷贝移植的方式迁移Python环境到Anaconda虚拟环境,但…...
AI 数字短视频数字人源码开发:多维赋能短视频生态革新
在短视频行业深度发展的进程中,AI 数字短视频数字人源码开发凭借其独特的技术优势,从多个维度为行业生态带来了革命性的变化,重塑短视频创作、传播与应用的格局。 数据驱动,实现内容精准化创作 AI 数字短视频数字人源码开发能够深…...
ffmpeg 硬解码相关知识
一:FFMPEG 支持的硬解方式:如下都是了解知识 DXVA2 - windows DXVA2 硬件加速技术解析 一、核心特性与适用场景 技术定义:DXVA2(DirectX Video Acceleration 2)是微软推出的基于 DirectX 的硬件加速标准…...
Ubuntu数据连接访问崩溃问题
目录 一、分析问题 1、崩溃问题本地调试gdb调试: 二、解决问题 1. 停止 MySQL 服务 2. 卸载 MySQL 相关包 3. 删除 MySQL 数据目录 4. 清理依赖和缓存 5.重新安装mysql数据库 6.创建程序需要的数据库 三、验证 1、动态库更新了 2、头文件更新了 3、重新…...
边缘计算全透视:架构、应用与未来图景
边缘计算全透视:架构、应用与未来图景 一、产生背景二、本质三、特点(一)位置靠近数据源(二)分布式架构(三)实时性要求高 四、关键技术(一)硬件技术(二&#…...
迅为iTOP-RK3576开发板/核心板6TOPS超强算力NPU适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 支持INT4/INT8/INT16/FP16/BF16/TF32混合运算&a…...
前沿分享|技术雷达202504月刊精华
本期雷达 ###技术部分 7. GraphRAG 试验 在上次关于 检索增强生成(RAG)的更新中,我们已经介绍了GraphRAG。它最初在微软的文章中被描述为一个两步的流程: (1)对文档进行分块,并使用基于大语言…...
[创业之路-380]:企业法务 - 企业经营中,企业为什么会虚开増值税发票?哪些是虚开増值税发票的行为?示例?风险?
一、动机与风险 1、企业虚开增值税发票的动机 利益驱动 骗抵税款:通过虚开发票虚增进项税额,减少应纳税额,降低税负。公司套取国家的利益。非法套现:虚构交易开具发票,将资金从公司账户转移至个人账户,用…...