音视频解封装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 高亮分页查询…...

设计模式探索:责任链模式
1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求&…...

OceanBase 配置项系统变量实现及应用详解(3):新增配置项的方法
本专题的第一篇文章,配置项的定义及使用方法,详细阐述了配置项的基础用法。对于那些对源码抱有浓厚兴趣的同学来说,或许还希望深入了解配置项的实现原理,甚至渴望亲自添加新的配置项,以满足个性化的功能需求。 本文通…...

PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0
符合条件的 PCI SSC 利益相关者在 30 天的意见征询 (RFC) 期间审查 PCI PTS 硬件安全模块 (HSM) 模块化安全要求 v5.0 草案并提供反馈。 PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0图 从 7 月 8 日到 8 月 8 日,邀请符合条件的 PCI SSC 利益相关者在 30 天的意见…...

javaweb中的请求与响应--基于postman工具的应用(附带postman的详细安装步骤)
一、前言 后端的第一天感觉难度就上来了,可能是基础太过薄弱了吧。目前看视频已经有点跟不上了,果然15天想要拿下还是太勉强了点。30天还差不多。不知道读者们有没有好好的去学这方面的知识,没有什么是学不会的,关键是坚持。 Po…...

StarRocks下载使用说明和基础操作
简介 StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数…...

桥接模式案例
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。桥接模式通过创 建一个桥接接口,将抽象部分和实现部分连接起来,从而实现两者的解耦。下面是一个详细的桥接…...

Spring源码二十二:Bean实例化流程五
上一篇Spring源码二十一:Bean实例化流程四,咱们主要分析里createBeanInstance方法Spring给我们提供给的FactoryMethod方法,举例说明了factoryMethod属性如何使用,同时简单讨论了具体实现逻辑。 这一篇咱们将进入反射实例化Bean&am…...

Unity3D中UI层级改变详解
在Unity3D开发中,UI层级的调整是常见的需求,它直接关系到用户界面(UI)元素的显示顺序。在Unity的UI系统中,主要使用UGUI(Unitys Graphical User Interface)来实现界面布局和元素展示。本文将详细讲解Unity3D中如何改变…...

centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务
目录 1.安装jdk 1.1上传jdk安装包到/opt目录下并解压 1.2解压 1.3配置环境变量 2.安装hadoop 2.1.下载hadoop 2.2.解压hadoop 2.3配置环境变量 3.安装sqoop 3.1下载 3.2解压 3.3下载依赖包并复制到指定位置 3.3.1下载commons-lang-2.6-bin.tar.gz 3.3.2将mysql-c…...

asp .net core 避免请求body数据量过大
方法1, 全局避免 引入包 dotnet add package Microsoft.AspNetCore.Http.Features using Microsoft.AspNetCore.Http.Features;public void ConfigureServices(IServiceCollection services) {services.Configure<FormOptions>(options >{// 设置允许的最…...