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

音视频解封装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 前言 注意&#xff1a;flv是不支持h.265封装的。目前解封装功能正常&#xff0c;所得到的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)

硬件&#xff1a;STC8051U34K64 RA8889开发板&#xff08;硬件跳线变更为SPI-4模式&#xff0c;PS101&#xff0c;R143&#xff0c;R141短接&#xff0c;R142不接&#xff09; STC8051U34K64是STC最新推出来的单片机&#xff0c;主要用于替换传统的8051单片机&#xff0c;与标…...

关于C# 开发Winfrom事后总结

一&#xff1a;要求能读取文件夹中视频及图片并判断 private void Form1_Load(object sender, EventArgs e){string foldPath "路径";//获取该目录下的文件 string[] files Directory.GetFiles(foldPath "\\", "*.*", System.IO.SearchOption…...

Python学习笔记35:进阶篇(二十四)pygame的使用之音频文件播放

前言 基础模块的知识通过这么长时间的学习已经有所了解&#xff0c;更加深入的话需要通过完成各种项目&#xff0c;在这个过程中逐渐学习&#xff0c;成长。 我们的下一步目标是完成python crash course中的外星人入侵项目&#xff0c;这是一个2D游戏项目。在这之前&#xff…...

Transformer-LSTM预测 | Matlab实现Transformer-LSTM多变量时间序列预测

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

常见的点云数据的获取方式

1. 激光雷达&#xff08;LiDAR&#xff09; 获取方式&#xff1a;激光脉冲测距原理&#xff1a;激光雷达通过发射激光脉冲并接收反射信号来测量物体与传感器之间的距离。计算激光脉冲从发射到返回所需的时间&#xff0c;并将其转换为距离&#xff0c;从而生成三维点云数据。常…...

java 中钻石操作符 <> 的使用场景

在 Java 中&#xff0c;<> 符号通常被称为 "钻石操作符" (Diamond Operator)&#xff0c;主要用于泛型类型的简化表示。<> 操作符引入于 Java 7&#xff0c;以减少泛型实例化时的冗余代码。以下是 <> 符号在 Java 中的几种主要使用场景&#xff1a…...

C++ 定时器触发

c定时器&#xff0c;能够定时触发&#xff0c;即每隔一段固定时间执行一下函数 #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.镜像查…...

现在有什么副业可以让人快速上岸?可以试试这个行业上岸其实不难

人为什么要努力赚銭&#xff1f; 当你想结婚的时候&#xff0c; 你可以慢慢挑&#xff0c;不着急。 当父母年老遭遇大病的时候&#xff0c; 你有机会尽孝。 当孩子需要时&#xff0c;你不会囊中羞涩。 年轻时以为金钱最重要&#xff0c; 如今年纪大了&#xff0c;发现这…...

每天一个数据分析题(四百二十)- 一元线性回归模型

现在通过参数估计得到一个一元线性回归模型为y 3x4&#xff0c;在回归系数检验中下列说法错误的是&#xff08; &#xff09; A. 检验统计量是t统计量 B. 原假设是β13 C. 若拒绝原假设&#xff0c;就认为自变量与因变量存在显著的线性关系 D. 可以用P值与显著性水平比较结…...

day11:01文件处理

一、文件与文件模式介绍 1、什么是文件 文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口 用户/应用程序(open()) 操作系统&#xff08;文件&#xff09; 计算机硬件&#xff08;硬盘&#xff09;2、为何要用文件 ①用户/应用程序可以通过文件将数据永久保存…...

一场夏测杀出个“双冠王”,极越01成为纯电SUV标杆

文 | AUTO芯球 作者 | 雷慢 万万没想到&#xff0c;懂车帝夏测运动会杀出一匹最大的黑马&#xff0c;竟然是极越01。 当前正在进行的懂车帝夏测运动会&#xff0c;在“纯电SUV/MPV续航达成率”赛事中&#xff0c;极越01以85.8%的续航达成率获得第一名。并且由于赛制规则限制…...

外科休克病人的护理

一、引言 休克是外科常见的危急重症之一,它是由于机体遭受强烈的致病因素侵袭后,有效循环血量锐减、组织灌注不足所引起的以微循环障碍、细胞代谢紊乱和器官功能受损为特征的综合征。对于外科休克病人的护理,至关重要。 二、休克的分类 外科休克主要分为低血容量性休克(包括…...

C-study(五).2

逻辑运算符 连接两个完整的关系表达式。 && 逻辑与&#xff0c;ab都为真时&#xff0c;a&&b的值真&#xff0c;其余时候假。 || 逻辑或&#xff0c;ab都为假时&#xff0c;a||b的值假&#xff0c;其余时候真。 ! 逻辑非、只需要一个运算对象&#xff0c;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格式 步骤&#xff1a; 1.根据压缩文件原始路径(字符串),创建源文件对象(File对象) 2.创建根目录对象&#xff0c;传入源文件的根目录 3.判断根目录,是否已经存在 ①如果存在&#xff0c;则删除&#xff1b; ②如果不存在&#xff0c;则创建根目录。 4.可以用Zip…...

rocket mq保证消息幂等性

在互联网应用中&#xff0c;尤其在网络不稳定的情况下&#xff0c;消息队列 RocketMO 的消息有可能会出现重复&#xff0c;这个重复简单可以概括为以下情况: 1、发送时消息重复 当一条消息已被成功发送到服务端并完成持久化&#xff0c;此时出现了网络闪断或者客户端宕机&…...

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 高亮分页查询…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...