音视频解封装demo:将FLV文件解封装(demux)得到文件中的H264数据和AAC数据(纯手工,不依赖第三方开源库)
1、README
前言
注意:flv是不支持h.265封装的。目前解封装功能正常,所得到的H.264文件与AAC文件均可正常播放。
a. demo使用
$ make clean && make DEBUG=1
$
$ $ ./flv_demux_h264_aac
Usage: ./flv_demux_h264_aac avfile/test1.flv./flv_demux_h264_aac avfile/test2.flv
b. 参考链接
【参考文章】
-
FLV格式详解_JT同学的博客-CSDN博客_flv格式**(推荐!!!)**
-
FLV封装格式介绍及解析 - 简书
-
音视频封装:FLV格式详解和打包H264、AAC方案(上) - 云+社区 - 腾讯云
-
音视频封装:FLV格式详解和打包H264、AAC方案(下) - 云+社区 - 腾讯云
【参考源码】
-
https://github.com/ImSjt/H.264toFLV.git
-
https://github.com/rainfly123/flvmuxer
【工具下载】
-
SpecialAAAC.exe:https://sourceforge.net/projects/aacstreamanalysis/
-
H264BSAnalyzer.exe:https://github.com/latelee/H264BSAnalyzer/tree/master/release
-
FlvParse.exe:https://github.com/ty6815/AvStackDocs/tree/master/media%20format/flv
c. demo目录架构
$ tree
.
├── aac_adts.c
├── aac_adts.h
├── avfile
│ ├── test1.aac
│ ├── test1.flv
│ ├── test1.h264
│ ├── test2.aac
│ ├── test2.flv
│ └── test2.h264
├── docs
│ ├── FLV封装格式介绍及解析 - 简书.mhtml
│ ├── FLV格式详解_JT同学的博客-CSDN博客_flv格式.mhtml
│ ├── 笔记---H.264里的SEI - 简书.mhtml
│ ├── 音视频封装:FLV格式详解和打包H264、AAC方案(上) - 云+社区 - 腾讯云.mhtml
│ └── 音视频封装:FLV格式详解和打包H264、AAC方案(下) - 云+社区 - 腾讯云.mhtml
├── flv.c
├── flv_format.h
├── flv.h
├── h264_nalu.h
├── main.c
├── Makefile
├── README.md
├── reference_code
│ └── Flv_to_h264_AAC_Demux.zip
└── tools├── FlvParse.exe├── H264BSAnalyzer.exe└── SpecialAAAC.exe
2、主要代码片段
flv_format.h
/**************************************************************** describe: Flv file format description(Mainly for H.264 & AAC)* author: linriming* e-mail: linriming20@163.com***************************************************************/#ifndef __FLV_FORMAT_H__
#define __FLV_FORMAT_H__#include <stdint.h>#define AUDIO_SUPPORT(x) (x << 2) /* bit[2] in flvheader's type_flag */
#define VIDEO_SUPPORT(x) (x << 0) /* bit[0] in flvheader's type_flag */#define SIZE_FLV_HEADER sizeof(struct flvHeader) /* 9 Bytes */
#define SIZE_FLV_TAG_HEADER sizeof(struct flvTagHeader) /* 11 Bytes */
#define SIZE_PREVIOUS_TAG_SIZE sizeof(uint32_t) /* 4 Bytes *//* FLV tag type */
typedef enum{FLVTAG_TYPE_AUDIO = 0x08,FLVTAG_TYPE_VIDEO = 0x09,FLVTAG_TYPE_SCRIPT = 0x12,
}flvTagType;/* AMF data type in <Script Tag> */
typedef enum{AMF_DATA_TYPE_NUMBER = 0x00,AMF_DATA_TYPE_BOOL = 0x01,AMF_DATA_TYPE_STRING = 0x02,AMF_DATA_TYPE_OBJECT = 0x03,AMF_DATA_TYPE_NULL = 0x05,AMF_DATA_TYPE_UNDEFINED = 0x06,AMF_DATA_TYPE_REFERENCE = 0x07,AMF_DATA_TYPE_MIXEDARRAY = 0x08,AMF_DATA_TYPE_OBJECT_END = 0x09,AMF_DATA_TYPE_ARRAY = 0x0a,AMF_DATA_TYPE_DATE = 0x0b,AMF_DATA_TYPE_LONG_STRING = 0x0c,AMF_DATA_TYPE_UNSUPPORTED = 0x0d,
} amfDataType;/* audio tag */
typedef enum{SFI_LINEAR_PCM_PLATFORM_ENDIAN = 0,SFI_ADPCM = 1,SFI_MP3 = 2,SFI_LINEAR_PCM_LITTLE_ENDIAN = 3,SFI_NELLYMOSER_16KHZ_MONO = 4,SFI_NELLYMOSER_8KHZ_MONO = 5,SFI_NELLYMOSER = 6,SFI_G711A = 7,SFI_G711MU = 8,SFI_RESERVED = 9,SFI_AAC = 10,SFI_SPEEX = 11,SFI_MP3_8KHZ = 14,SFI_DEVIVE_SPECIFIC_SOUND = 15,
}soundFormatIndex;typedef enum{SRI_5_5KHZ = 0,SRI_11KHZ = 1,SRI_22KHZ = 2,SRI_44KHZ = 3,
}soundSamplerateIndex;typedef enum{SSI_8BIT = 0,SSI_16BIT = 1,
}soundSizeIndex;typedef enum{STI_MONO = 0,STI_STEREO = 1,
}soundTypeIndex;#define AAC_PACKET_TYPE_SEQUENCE_HEADER (0)
#define AAC_PACKET_TYPE_RAW (1)typedef enum{AAC_MAIN = 1,AAC_LC = 2,AAC_SSR = 3,
}aacProfileIndex;typedef enum{AAC_96KHz = 0x0,AAC_88_2KHz = 0x1,AAC_64KHz = 0x2,AAC_48KHz = 0x3,AAC_44_1KHz = 0x4,AAC_32KHz = 0x5,AAC_24KHz = 0x6,AAC_22_05KHz = 0x7,AAC_16KHz = 0x8,AAC_12KHz = 0x9,AAC_11_025KHz = 0xa,AAC_8KHz = 0xb,AAC_RESERVED = 0xc,
}aacSamplerateIndex;typedef enum{AAC_CHANNEL_SPECIAL = 0x0,AAC_CHANNEL_MONO = 0x1,AAC_CHANNEL_STEREO = 0x2,AAC_CHANNEL_3 = 0x3,AAC_CHANNEL_4 = 0x4,AAC_CHANNEL_5 = 0x5,AAC_CHANNEL_5_1 = 0x6,AAC_CHANNEL_7_1 = 0x7,AAC_CHANNELRESERVED = 0x8,
}aacChannelIndex;#define AVC_PACKET_TYPE_SEQUENCE_HEADER (0)
#define AVC_PACKET_TYPE_NALU (1)
#define AVC_PACKET_TYPE_END_OF_SEQUENCE (2)/* next for video tag */
#define VIDEOTAG_FRAMETYPE_KEYFRAME (1)
#define VIDEOTAG_FRAMETYPE_INTER_FRAME (2)
#define VIDEOTAG_FRAMETYPE_DISPOSABLE_INTER_FRAME (3)
#define VIDEOTAG_FRAMETYPE_GENERATED_KEYFRAME (4)
#define VIDEOTAG_FRAMETYPE_VIDEO_INFO_FRAME (5)#define VIDEOTAG_CODECID_JPEG (1)
#define VIDEOTAG_CODECID_SORENSON_H263 (2)
#define VIDEOTAG_CODECID_SCREEN_VIDEO (3)
#define VIDEOTAG_CODECID_ON2_VP6 (4)
#define VIDEOTAG_CODECID_ON2_VP6_WITH_ALPHA_CHANNEL (5)
#define VIDEOTAG_CODECID_SCREEN_VIDEO_VERSION_2 (6)
#define VIDEOTAG_CODECID_AVC (7)#pragma pack(push)
#pragma pack(1) /* 1 bytes align */typedef struct flvHeader{uint8_t signature[3]; /* signature bytes always 'F' 'L' 'V': 0x46 0x4C 0x56 */uint8_t version; /* file version, always 0x01 */uint8_t type_flag; /* bit[7:3] and bit[1] always 0, bit[2] for aduio, bit[0] for video */uint32_t data_offset; /* size of header, 00 00 00 09(big-endian) for version 1 */
}T_FlvHeader, *PT_FlvHeader; /* 9 bytes totally */typedef struct flvTagHeader{uint8_t TagType; /* Type of this tag. Value are 8(audio), 9(video), 18(script), other(reserved). */uint8_t DataSize[3]; /* Length of the data in the Data filed. */uint8_t Timestamp[3]; /* Time in milliseconds at which the data in this applies. 0 in first tag in the FLV file. */uint8_t TimestampExtended; /* Extension of Timestamp field to form a SI32 value, it is upper 8 bits. */uint8_t StreamID[3]; /* Always 0 */
}T_FlvTagHeader, *PT_FlvTagHeader; /* 11 bytes total */typedef struct flvTag{T_FlvTagHeader flvheader; /* tag header */uint8_t flvdata[0]; /* tag data index */
}T_FlvTag, *PT_FlvTag;typedef struct avcVideoPacket{T_FlvTagHeader flvheader;uint8_t flvdata[0]; /* flv tag data index */
}T_AvcVideoPacket, *PT_AvcVideoPacket;#pragma pack(pop)#endif /* __FLV_FORMAT_H__ */
flv.c
#include "h264_nalu.h"
#include "aac_adts.h"
#include "flv.h"int flv_demux_h264_aac(const char *flvFileName)
{FILE *fpH264 = NULL;FILE *fpAAC = NULL;FILE *fpFLV = NULL;uint8_t *flvBuf = NULL;// note!!!: it maybe happen the 'Segmentation fault', as 1024 is too long for 'sps', but it maybe save the 'sei' or other unused data if first nalu isn't 'sps'.uint8_t spsBuf[64] = {0};uint8_t ppsBuf[64] = {0};uint32_t spsLen = 0;uint32_t ppsLen = 0;int ret = -1;uint32_t flvTagDataSize = 0;PT_FlvTag ptFlvTag = NULL;const char *h264FileName = "out_video.h264";const char *aacFileName = "out_audio.aac";/* open file */fpFLV = fopen(flvFileName, "rb");if (!fpFLV){printf("open %s error!\n", flvFileName);}fpH264 = fopen(h264FileName, "wb");if (!fpH264){printf("open %s error!\n", h264FileName);}fpAAC = fopen(aacFileName, "wb");if (!fpAAC){printf("open %s error!\n", aacFileName);}/* alloc memory */flvBuf = (uint8_t *)malloc(MAX_FLV_BUF_SIZE);if (!flvBuf){printf("malloc for 'flvBuf' error!\n");}/* parse and save some data first. */fread(flvBuf, SIZE_FLV_HEADER, 1, fpFLV);ret = strncmp((const char *)flvBuf, "FLV", 3);if(ret != 0){printf("\033[31m It's not a FLV file!\n\033[0m");return -1;}DEBUG("\033[32m""=====================================\n""Signature: '%c' '%c' '%c'\n""Version : 0x%02x\n""Audio : %s\n""Video : %s\n""=====================================\n""\033[0m",flvBuf[0], flvBuf[1], flvBuf[2], flvBuf[3], (flvBuf[4] & 0x04) ? "yes" : "no", (flvBuf[4] & 0x01) ? "yes" : "no");fread(flvBuf, SIZE_PREVIOUS_TAG_SIZE, 1, fpFLV);DEBUG("\033[37m[Pre Tag Size]: %d \033[0m\n", (flvBuf[0] << 24) |\(flvBuf[1] << 16) |\(flvBuf[2] << 8) |\flvBuf[3]);while(1){ret = fread(flvBuf, SIZE_FLV_TAG_HEADER, 1, fpFLV);if (ret <= 0){DEBUG(">>> FLV file end! <<<\n");break;}ptFlvTag = (PT_FlvTag)flvBuf;flvTagDataSize = (ptFlvTag->flvheader.DataSize[0] << 16) |\(ptFlvTag->flvheader.DataSize[1] << 8) |\ptFlvTag->flvheader.DataSize[2];fread(ptFlvTag->flvdata, flvTagDataSize, 1, fpFLV);switch (ptFlvTag->flvheader.TagType){case FLVTAG_TYPE_SCRIPT: {DEBUG("\033[34m[Script Tag] \033[0m\n");/* nothing to do! */break;}case FLVTAG_TYPE_AUDIO: {char *packetTypeStr = NULL;int aacPacketType = ptFlvTag->flvdata[1];switch(aacPacketType){case AAC_PACKET_TYPE_SEQUENCE_HEADER:packetTypeStr = "[AAC sequence header]";/* nothing to do! */break;case AAC_PACKET_TYPE_RAW:packetTypeStr = "[AAC raw]";uint8_t headerbuf[AAC_ADTS_HEADER_SIZE] = {0};uint32_t headerbufLen = 0;uint32_t datasize = ((ptFlvTag->flvheader.DataSize[0] << 16) |\(ptFlvTag->flvheader.DataSize[1] << 8) |\ptFlvTag->flvheader.DataSize[2]);generateAdtsHeader(AAC_ADTS_HEADER_SIZE + (datasize - 2), headerbuf, &headerbufLen);fwrite(headerbuf, headerbufLen, 1, fpAAC);fwrite(&ptFlvTag->flvdata[2], datasize - 2, 1, fpAAC);break;default:printf("[%s:%d] Unknown AAC packet type!", __FUNCTION__, __LINE__);goto exit;}DEBUG("\033[36m[Audio Tag] \t %s\033[0m\n", packetTypeStr);break;}case FLVTAG_TYPE_VIDEO: {char *packetTypeStr = NULL;char *frameTypeStr = NULL;uint8_t startCode[4] = {0x00, 0x00, 0x00, 0x01};int isKeyFrame = 0;int type = 0;isKeyFrame = (ptFlvTag->flvdata[0] & 0xF0) == 0x10 ? 1 : 0;type = ptFlvTag->flvdata[1];switch(type){case AVC_PACKET_TYPE_SEQUENCE_HEADER:packetTypeStr = "[AVC squence header]";frameTypeStr = "[key frame]";spsLen = ((ptFlvTag->flvdata[11] << 8) | ptFlvTag->flvdata[12]);memcpy(spsBuf, &ptFlvTag->flvdata[13], spsLen);//printf("spsLen: %d\n", spsLen);//for(int i = 0; i < spsLen; i++)// printf("0x%02x ", spsBuf[i]);//printf("\n");ppsLen = ((ptFlvTag->flvdata[13 + spsLen + 1] << 8) | ptFlvTag->flvdata[13+spsLen+2]);memcpy(ppsBuf, &ptFlvTag->flvdata[13 + spsLen + 3], ppsLen);//printf("ppsLen: %d\n", ppsLen);//for(int i = 0; i < ppsLen; i++)// printf("0x%02x ", ppsBuf[i]);//printf("\n");break;case AVC_PACKET_TYPE_NALU:packetTypeStr = "[AVC NALU]";/* one or more NALU. */uint32_t naluDataSize = 0;uint32_t curPos = 0;curPos = 5;naluDataSize = (ptFlvTag->flvdata[curPos + 0] << 24) |\(ptFlvTag->flvdata[curPos + 1] << 16) |\(ptFlvTag->flvdata[curPos + 2] << 8) |\ptFlvTag->flvdata[curPos + 3];if(isKeyFrame){frameTypeStr = "[key frame]";if((ptFlvTag->flvdata[curPos + 4] & 0x1f) == NALU_TYPE_SEI &&\(ptFlvTag->flvdata[curPos + 5] & 0x1f) == 0x05/* SEI: payloadType: user_data_unregistered() */){/* has SEI *//* SEI */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(&ptFlvTag->flvdata[curPos + 4], naluDataSize, 1, fpH264);/* SPS */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(spsBuf, spsLen, 1, fpH264);/* PPS */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(ppsBuf, ppsLen, 1, fpH264);/* update the second NALU data size. */curPos += (4 + naluDataSize);naluDataSize = (ptFlvTag->flvdata[curPos + 0] << 24) |\(ptFlvTag->flvdata[curPos + 1] << 16) |\(ptFlvTag->flvdata[curPos + 2] << 8) |\ptFlvTag->flvdata[curPos + 3];/* IDR */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(&ptFlvTag->flvdata[curPos + 4], naluDataSize, 1, fpH264);}else{/* SPS */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(spsBuf, spsLen, 1, fpH264);/* PPS */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(ppsBuf, ppsLen, 1, fpH264);/* IDR */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(&ptFlvTag->flvdata[curPos + 4], naluDataSize, 1, fpH264);}}else{frameTypeStr = "[inter frame]";/* SLICE */fwrite(startCode, sizeof(startCode), 1, fpH264);fwrite(&ptFlvTag->flvdata[curPos + 4], naluDataSize, 1, fpH264);}break;case AVC_PACKET_TYPE_END_OF_SEQUENCE:packetTypeStr = "[AVC end of squence]";frameTypeStr = "[key frame]";break;default:printf("[%s:%d] Unknown AVC packet type!", __FUNCTION__, __LINE__);goto exit;}DEBUG("\033[35m[Video Tag] \t %s \t %s\033[0m\n", packetTypeStr, frameTypeStr);break;}default: {printf("\033[33m[Unknown Tag]\033[0m\n");break;}}fread(flvBuf, SIZE_PREVIOUS_TAG_SIZE, 1, fpFLV);DEBUG("\033[37m[PreTagSize] \t %d\033[0m\n", (flvBuf[0] << 24) |\(flvBuf[1] << 16) |\(flvBuf[2] << 8) |\flvBuf[3]);}exit:if(fpFLV) fclose(fpFLV);if(fpH264) {fflush(fpH264); fclose(fpH264);}if(fpAAC) {fflush(fpAAC); fclose(fpAAC);}if(flvBuf) free(flvBuf);return 0;
}
main.c
#include <stdio.h>#include "flv.h"int main(int argc, char *argv[])
{if(argc == 1){printf("Usage: \n"" %s avfile/test1.flv\n"" %s avfile/test2.flv\n",argv[0], argv[0]);return -1;}flv_demux_h264_aac(argv[1]);printf("\033[32m""Success!\n""\033[0m");return 0;
}
3、demo下载地址(任选一个)
- https://download.csdn.net/download/weixin_44498318/89526743
- https://gitee.com/linriming/av_flv_demux_h264_aac.git
- https://github.com/linriming20/av_flv_demux_h264_aac.git
相关文章:
音视频解封装demo:将FLV文件解封装(demux)得到文件中的H264数据和AAC数据(纯手工,不依赖第三方开源库)
1、README 前言 注意:flv是不支持h.265封装的。目前解封装功能正常,所得到的H.264文件与AAC文件均可正常播放。 a. demo使用 $ make clean && make DEBUG1 $ $ $ ./flv_demux_h264_aac Usage: ./flv_demux_h264_aac avfile/test1.flv./flv_d…...

51单片机(STC8051U34K64)_RA8889_SPI4参考代码(v1.3)
硬件:STC8051U34K64 RA8889开发板(硬件跳线变更为SPI-4模式,PS101,R143,R141短接,R142不接) STC8051U34K64是STC最新推出来的单片机,主要用于替换传统的8051单片机,与标…...
关于C# 开发Winfrom事后总结
一:要求能读取文件夹中视频及图片并判断 private void Form1_Load(object sender, EventArgs e){string foldPath "路径";//获取该目录下的文件 string[] files Directory.GetFiles(foldPath "\\", "*.*", System.IO.SearchOption…...

Python学习笔记35:进阶篇(二十四)pygame的使用之音频文件播放
前言 基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。 我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前ÿ…...

Transformer-LSTM预测 | Matlab实现Transformer-LSTM多变量时间序列预测
Transformer-LSTM预测 | Matlab实现Transformer-LSTM多变量时间序列预测 目录 Transformer-LSTM预测 | Matlab实现Transformer-LSTM多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-LSTM多变量时间序列预测,Transf…...

常见的点云数据的获取方式
1. 激光雷达(LiDAR) 获取方式:激光脉冲测距原理:激光雷达通过发射激光脉冲并接收反射信号来测量物体与传感器之间的距离。计算激光脉冲从发射到返回所需的时间,并将其转换为距离,从而生成三维点云数据。常…...
java 中钻石操作符 <> 的使用场景
在 Java 中,<> 符号通常被称为 "钻石操作符" (Diamond Operator),主要用于泛型类型的简化表示。<> 操作符引入于 Java 7,以减少泛型实例化时的冗余代码。以下是 <> 符号在 Java 中的几种主要使用场景:…...
C++ 定时器触发
c定时器,能够定时触发,即每隔一段固定时间执行一下函数 #include <iostream> #include <thread> #include <chrono> #include <signal.h> #include <time.h> #include <cstring> #include <glog/logging.h>#…...
【Docker 入门】
文章目录 概要 一、安装Docker CE1.1.配置阿里云镜像加速【可选】1.2.重启 二、Docker版本选择三、Docker指令1.Docker命令1.1.run1.2.start/stop/restart1.3.kill1.4.rm1.5.create1.6.ps1.7.exec1.8.top1.9.port 2.Dockerfile关键字3.镜像打包4.镜像运行5.镜像导入导出6.镜像查…...

现在有什么副业可以让人快速上岸?可以试试这个行业上岸其实不难
人为什么要努力赚銭? 当你想结婚的时候, 你可以慢慢挑,不着急。 当父母年老遭遇大病的时候, 你有机会尽孝。 当孩子需要时,你不会囊中羞涩。 年轻时以为金钱最重要, 如今年纪大了,发现这…...
每天一个数据分析题(四百二十)- 一元线性回归模型
现在通过参数估计得到一个一元线性回归模型为y 3x4,在回归系数检验中下列说法错误的是( ) A. 检验统计量是t统计量 B. 原假设是β13 C. 若拒绝原假设,就认为自变量与因变量存在显著的线性关系 D. 可以用P值与显著性水平比较结…...
day11:01文件处理
一、文件与文件模式介绍 1、什么是文件 文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口 用户/应用程序(open()) 操作系统(文件) 计算机硬件(硬盘)2、为何要用文件 ①用户/应用程序可以通过文件将数据永久保存…...

一场夏测杀出个“双冠王”,极越01成为纯电SUV标杆
文 | AUTO芯球 作者 | 雷慢 万万没想到,懂车帝夏测运动会杀出一匹最大的黑马,竟然是极越01。 当前正在进行的懂车帝夏测运动会,在“纯电SUV/MPV续航达成率”赛事中,极越01以85.8%的续航达成率获得第一名。并且由于赛制规则限制…...
外科休克病人的护理
一、引言 休克是外科常见的危急重症之一,它是由于机体遭受强烈的致病因素侵袭后,有效循环血量锐减、组织灌注不足所引起的以微循环障碍、细胞代谢紊乱和器官功能受损为特征的综合征。对于外科休克病人的护理,至关重要。 二、休克的分类 外科休克主要分为低血容量性休克(包括…...

C-study(五).2
逻辑运算符 连接两个完整的关系表达式。 && 逻辑与,ab都为真时,a&&b的值真,其余时候假。 || 逻辑或,ab都为假时,a||b的值假,其余时候真。 ! 逻辑非、只需要一个运算对象,a真&a…...
使用Ultralytics YOLO进行模型验证
使用Ultralytics YOLO进行模型验证 使用Ultralytics YOLO进行模型验证简介为什么使用Ultralytics YOLO进行验证?验证模式的主要功能使用示例YOLO模型验证参数使用参数进行验证的示例使用Ultralytics YOLO进行模型验证 简介 验证是机器学习管道中的关键步骤,可以评估训练模型…...
MICCAI 2023 List of Papers
MICCAI 2023 - Accepted Papers, Reviews, Author Feedback List of Papers https://conferences.miccai.org/2023/papers/ • 3D Arterial Segmentation via Single 2D Projections and Depth Supervision in Contrast-Enhanced CT Images • 3D Dental Mesh Segmentation U…...
压缩文件的解析方式
一、解压缩zip格式 步骤: 1.根据压缩文件原始路径(字符串),创建源文件对象(File对象) 2.创建根目录对象,传入源文件的根目录 3.判断根目录,是否已经存在 ①如果存在,则删除; ②如果不存在,则创建根目录。 4.可以用Zip…...
rocket mq保证消息幂等性
在互联网应用中,尤其在网络不稳定的情况下,消息队列 RocketMO 的消息有可能会出现重复,这个重复简单可以概括为以下情况: 1、发送时消息重复 当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机&…...
Elasticsearch基本操作
文章目录 1.1 索引库操作1.1.1 创建索引库 :1.1.2 删除索引库 :1.1.3 判断索引库是否存在 1.2 文档操作1.2.1 新增文档1.2.2 查询文档1.2.3 删除文档1.2.4 修改文档1.2.5 批量导入文档 1.3 RestClient查询1.3.1 普通查询1.3.2 复合条件查询1.3.3 分页排序查询1.3.4 高亮分页查询…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...