Windows软件插件-写wav
下载本插件
本插件,将PCM音频流写入WAV音频文件。或将PCM音频流压缩为ALAW格式,写入WAV文件。可以创作大文件(超过4字节所能表示的大小)。插件类型为DLL,可以在win32和MFC程序中使用。使用本插件创建的ALAW格式WAV音频文件,Windows播放器不能播放,可以使用其它播放器播放。
使用方法
首先,加载本“写wav”DLL,获得DLL模块句柄。
HMODULE hWav = LoadLibrary(L"写wav.dll");//加载“写wav”DLL模块
获取所有导出函数的地址。
typedef int(__cdecl *MYPROC_VOID)();
typedef int(__cdecl *MYPROC_WAV_Init)(int index, WAV_INIT init);
typedef int(__cdecl *MYPROC_ISample)(int index, BYTE* pB, LONG len);
typedef int(__cdecl *MYPROC_IVOID)(int index);MYPROC_VOID WAV_Create=NULL;
MYPROC_WAV_Init WAV_Init=NULL;
MYPROC_ISample WAV_Sample=NULL;
MYPROC_IVOID WAV_Run=NULL;
MYPROC_IVOID WAV_Stop=NULL;
MYPROC_IVOID WAV_Exit=NULL;
MYPROC_IVOID WAV_GetState=NULL;
MYPROC_VOID WAV_DestroyAll=NULL;if (hWav){WAV_Create=(MYPROC_VOID)GetProcAddress(hWav, "Create");//获取“创建写wav类对象”函数地址WAV_Init=(MYPROC_WAV_Init)GetProcAddress(hWav, "Init");//获取“初始化”函数地址WAV_Sample = (MYPROC_ISample)GetProcAddress(hWav, "WriteSample");//获取“写样本”函数地址WAV_Run=(MYPROC_IVOID)GetProcAddress(hWav, "Run");//“运行”函数WAV_Stop = (MYPROC_IVOID)GetProcAddress(hWav, "Stop");//“停止”函数WAV_Exit = (MYPROC_IVOID)GetProcAddress(hWav, "Exit");//“退出”函数WAV_GetState = (MYPROC_IVOID)GetProcAddress(hWav, "GetState");//“获取状态”函数WAV_DestroyAll=(MYPROC_VOID)GetProcAddress(hWav, "DestroyAll");//“销毁所有类对象”函数}
调用“创建”函数,创建一个写wav类对象。对象在DLL内部,外部无法直接访问。
WAV_Create(); //创建写wav类对象。可以多次调用该函数,以创建多个对象;函数返回对象索引,索引从0开始
提供初始化参数,调用“初始化”函数。初始化函数创建了写wav线程。在线程中,创建wav文件,写wav文件头,格式块。
struct WAV_INIT//“初始化参数”结构
{WCHAR* Path;//输出文件路径int FormatType;//压缩方式。仅支持PCM(值1),ALAW(值6)WORD nChannels;//声道数DWORD SamplesPerSec;//音频采样率
};WAV_INIT WavInit;WavInit.Path = L"D:\\某名称.wav";//提供wav输出文件路径WavInit.FormatType = 1;//PCMWavInit.nChannels = 2;//2声道WavInit.SamplesPerSec = 48000;//采样率48000WAV_Init(0, WavInit);//参数1为“写wav类对象”索引。如果只创建了一个对象,使用索引0初始化该对象,如果有第二个对象,使用索引1
调用“运行”函数。函数调用后,可以写入样本。
WAV_Run(0);//参数0,表示运行第一个类对象
反复调用“写样本”函数,写入样本。函数的参数1为类对象索引;参数2,提供包含wav数据的样本缓冲区指针;参数3,样本的字节大小。
WAV_Sample(0, pB, len);//写wav样本。pB类型为BYTE*,len类型为LONG
调用“停止”函数,可以暂停写入样本。即使此时“写样本”函数仍在调用,也不会将样本写入wav文件。
WAV_Stop(0);//参数0,表示暂停第一个类对象
调用“停止”和“退出”函数。结束写样本,完善wav文件,包括指定文件大小,数据大小。退出写wav线程。
WAV_Stop(0);WAV_Exit(0);
在程序退出时,销毁写wav对象。
WAV_DestroyAll();//函数可以销毁创建的所有对象
“写wav”DLL的全部代码
创建DLL时,需指定“在共享DLL中使用MFC”。
WavWriter.h
#pragma once
#include <SDKDDKVer.h>#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS // 移除对话框中的 MFC 控件支持#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT// Windows 头文件:
#include <windows.h>struct WAV_INIT
{WCHAR* Path;//输出文件路径int FormatType;//压缩方式。仅支持PCM(值1),ALAW(值6)WORD nChannels;//声道数DWORD SamplesPerSec;//音频采样率
};class CQueue//队列
{
public:CQueue(UINT size, HANDLE hExit);~CQueue();BOOL Add(BYTE* pB, LONG len);BOOL Reduce(BYTE*& pB, LONG& len);UINT mSize;BYTE* pBuffer = NULL;BYTE* pAdd = NULL, *pReduce = NULL;HANDLE hAdd = NULL;HANDLE hReduce = NULL;HANDLE mhExit = NULL;
};class WavWriter
{
public:WavWriter();~WavWriter();WAV_INIT mInit;//初始化结构对象HANDLE hStop = NULL;//“停止”事件句柄HANDLE hExit = NULL;//“退出”事件句柄HANDLE hThread = NULL;//线程句柄HANDLE hReady = NULL;CQueue* pQueue = NULL;//样本队列BOOL mRun = FALSE;void Run();void Stop();void Exit();CString WavFilePath;//wav输出文件路径BOOL Init(WAV_INIT init);//初始化函数void WriteSample(BYTE* pB, LONG len){DWORD dw = WaitForSingleObject(hStop, 0);//检测“停止”信号if (dw == WAIT_OBJECT_0)//如果“停止”有信号,不将样本加入队列return;if (pQueue)pQueue->Add(pB, len);}
};
WavWriter.cpp
#include "WavWriter.h"CQueue::CQueue(UINT size, HANDLE hExit)
{mSize = size;mhExit = hExit;pBuffer = new BYTE[size * 10];pAdd = pReduce = pBuffer;hAdd = CreateSemaphore(NULL, 0, 10, NULL);//创建“已用”信号量,初始计数0,最大计数10hReduce = CreateSemaphore(NULL, 10, 10, NULL);//创建“可用”信号量,初始计数10,最大计数10
}
CQueue::~CQueue()
{delete[] pBuffer; pBuffer = NULL;CloseHandle(hAdd); CloseHandle(hReduce);
}BOOL CQueue::Add(BYTE* pB, LONG len)
{HANDLE h[2] = { hReduce, mhExit };DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);//“可用”信号量减1,无限期等待if (dw == 1)return FALSE;//如果有“退出”信号,返回。消除阻塞CopyMemory(pAdd, &len, 4); pAdd += 4;CopyMemory(pAdd, pB, len); pAdd += mSize - 4;if (pAdd > pBuffer + mSize * 9)pAdd = pBuffer;LONG Pre;ReleaseSemaphore(hAdd, 1, &Pre);//“已用”信号量加1return TRUE;
}BOOL CQueue::Reduce(BYTE*& pB, LONG& len)
{HANDLE h[2] = { hAdd, mhExit };DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);//“已用”信号量减1,无限期等待if (dw == 1)return FALSE;//如果有“退出”信号,返回。消除阻塞CopyMemory(&len, pReduce, 4); pReduce += 4;CopyMemory(pB, pReduce, len); pReduce += mSize - 4;if (pReduce > pBuffer + mSize * 9)pReduce = pBuffer;LONG Pre;ReleaseSemaphore(hReduce, 1, &Pre);//“可用”信号量加1return TRUE;
}WavWriter::WavWriter()
{hStop = CreateEvent(NULL, TRUE, TRUE, NULL);hExit = CreateEvent(NULL, TRUE, FALSE, NULL);hReady = CreateEvent(NULL, FALSE, FALSE, NULL);//创建“线程初始化完成”事件,自动重置,初始无信号
}WavWriter::~WavWriter()
{CloseHandle(hReady); CloseHandle(hStop); CloseHandle(hExit);
}unsigned char linear2alaw(int pcm_val);DWORD WINAPI WriterThread(LPVOID lp)
{WavWriter* pWriter = (WavWriter*)lp;pWriter->pQueue = new CQueue(1000000 + 4, pWriter->hExit);CFile F;F.Open(pWriter->WavFilePath, CFile::modeCreate | CFile::modeWrite);F.Write("RF64", 4);DWORD FileSize = UINT32_MAX;F.Write(&FileSize, 4);F.Write("WAVE", 4);F.Write("ds64", 4);DWORD ds64Size = 28;F.Write(&ds64Size, 4);//ds64块大小ULONGLONG dsFileSizePos = F.GetPosition();//记录文件大小位置ULONGLONG dsFileSize = 0;//此时并非实际大小F.Write(&dsFileSize, 8); //文件大小 = 文件总大小 - 8ULONGLONG dsDataSize = 0;//此时并非实际大小F.Write(&dsDataSize, 8);//数据大小ULONGLONG tableSize = 0;F.Write(&tableSize, 8);DWORD xw = 0;F.Write(&xw, 4);//保留F.Write("fmt ", 4);//fmtDWORD fmtSize = 16;F.Write(&fmtSize, 4);//fmt块大小WORD Format;Format = (WORD)pWriter->mInit.FormatType;F.Write(&Format, 2);//音频格式WORD nch = pWriter->mInit.nChannels;F.Write(&nch, 2);//声道数DWORD nSamples = pWriter->mInit.SamplesPerSec;F.Write(&nSamples, 4);//采样率 DWORD nBytes;if (pWriter->mInit.FormatType == 6)//ALAW{nBytes = nSamples * nch;}else//PCM{nBytes = nSamples * nch * 2;}F.Write(&nBytes, 4);//传输率 WORD block;if (pWriter->mInit.FormatType == 6){block = nch;}else//PCM{block = nch * 2;}F.Write(&block, 2);//块对齐 WORD bits;if (pWriter->mInit.FormatType == 6){bits = 8;}else{bits = 16;}F.Write(&bits, 2);//样本位数F.Write("data", 4);//写数据块标识DWORD DataSize = UINT32_MAX;F.Write(&DataSize, 4);ULONGLONG DataStar = F.GetPosition();BYTE* pS = new BYTE[1000000]; LONG len;BYTE* pD = NULL;if (pWriter->mInit.FormatType == 6){pD = new BYTE[500000];}SetEvent(pWriter->hReady);//发送“线程初始化完成”信号Agan:DWORD mStop = WaitForSingleObject(pWriter->hStop, 0);if (mStop != WAIT_OBJECT_0)//如果“停止”无信号{BOOL BReduce = pWriter->pQueue->Reduce(pS, len);//从队列读取样本if (BReduce)//如果读取样本成功{if (pWriter->mInit.FormatType == 6){short sh; BYTE data;for (int i = 0; i < len / 2; i++)//将PCM音频数据转换为ALAW数据{CopyMemory(&sh, pS + i * 2, 2);data = linear2alaw(sh);CopyMemory(pD + i, &data, 1);}F.Write(pD, len / 2);}else//PCM{F.Write(pS, len);}}}DWORD mExit = WaitForSingleObject(pWriter->hExit, 0);if (mExit == WAIT_OBJECT_0)//有“退出”信号{dsDataSize = F.GetPosition() - DataStar;dsFileSize = F.GetPosition() - 8;F.Seek(dsFileSizePos, CFile::begin);//移动文件指针到“文件大小”位置F.Write(&dsFileSize, 8);//写文件大小F.Write(&dsDataSize, 8);//写数据大小tableSize = dsDataSize / block;F.Write(&tableSize, 8);F.Close();Sleep(200);delete[] pS; if(pD)delete[] pD;delete pWriter->pQueue;return 0;}goto Agan;
}BOOL WavWriter::Init(WAV_INIT init)
{DWORD dw = WaitForSingleObject(hThread, 0);if (dw == WAIT_TIMEOUT)return FALSE;//如果线程已存在,返回if (init.FormatType != 1 && init.FormatType != 6){MessageBox(NULL, L"只允许PCM(1)和ALAW(6)", L"写WAV", MB_OK); return FALSE;}mInit = init;WavFilePath = (CString)init.Path;//wav输出文件路径ResetEvent(hExit);//设置“退出”无信号SetEvent(hStop);//设置“停止”有信号ResetEvent(hReady); //设置“线程初始化完成”无信号hThread = CreateThread(NULL, 0, WriterThread, this, 0, NULL);WaitForSingleObject(hReady, INFINITE);//等待“初始化完成”信号mRun = TRUE;return TRUE;
}void WavWriter::Run()
{ResetEvent(hStop);//设置“停止”无信号
}void WavWriter::Stop()
{SetEvent(hStop);//设置“停止”有信号
}void WavWriter::Exit()
{mRun = FALSE;SetEvent(hStop);//设置“停止”有信号SetEvent(hExit);//设置“退出”有信号WaitForSingleObject(hThread, INFINITE);//等待线程退出
}#define QUANT_MASK (0xf)
#define SEG_SHIFT (4) static short seg_end[8] = { 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF };unsigned char _u2a[128] = {1, 1, 2, 2, 3, 3, 4, 4,5, 5, 6, 6, 7, 7, 8, 8,9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19, 20, 21, 22, 23, 24,25, 27, 29, 31, 33, 34, 35, 36,37, 38, 39, 40, 41, 42, 43, 44,46, 48, 49, 50, 51, 52, 53, 54,55, 56, 57, 58, 59, 60, 61, 62,64, 65, 66, 67, 68, 69, 70, 71,72, 73, 74, 75, 76, 77, 78, 79,81, 82, 83, 84, 85, 86, 87, 88,89, 90, 91, 92, 93, 94, 95, 96,97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128
};unsigned char _a2u[128] = {1, 3, 5, 7, 9, 11, 13, 15,16, 17, 18, 19, 20, 21, 22, 23,24, 25, 26, 27, 28, 29, 30, 31,32, 32, 33, 33, 34, 34, 35, 35,36, 37, 38, 39, 40, 41, 42, 43,44, 45, 46, 47, 48, 48, 49, 49,50, 51, 52, 53, 54, 55, 56, 57,58, 59, 60, 61, 62, 63, 64, 64,65, 66, 67, 68, 69, 70, 71, 72,73, 74, 75, 76, 77, 78, 79, 79,80, 81, 82, 83, 84, 85, 86, 87,88, 89, 90, 91, 92, 93, 94, 95,96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
};static int search(int val, short *table, int size)
{int i;for (i = 0; i < size; i++) {if (val <= *table++)return (i);}return (size);
}unsigned char linear2alaw(int pcm_val)
{int mask;int seg;unsigned char aval;if (pcm_val >= 0){mask = 0xD5;}else{mask = 0x55;pcm_val = -pcm_val - 1;}seg = search(pcm_val, seg_end, 8);if (seg >= 8)return (0x7F ^ mask);else{aval = seg << SEG_SHIFT;if (seg < 2)aval |= (pcm_val >> 4) & QUANT_MASK;elseaval |= (pcm_val >> (seg + 3)) & QUANT_MASK;return (aval ^ mask);}
}WavWriter* pWavWriter[10];//类对象指针数组
int mNu = -1;#ifdef __cplusplus // If used by C++ code,
extern "C" { // we need to export the C interface
#endif__declspec(dllexport) int __cdecl Create()//创建类对象{mNu++;if (mNu > 9)return -1;//最多创建10个类对象pWavWriter[mNu] = new WavWriter();return mNu;}__declspec(dllexport) int __cdecl Init(int index, WAV_INIT WavInit)//初始化指定对象{if (pWavWriter[index]->Init(WavInit))return 1;return 0;}__declspec(dllexport) int __cdecl WriteSample(int index, BYTE* pB, LONG len)//指定对象写样本{pWavWriter[index]->WriteSample(pB, len);return 0;}__declspec(dllexport) int __cdecl GetState(int index)//获取指定对象状态{return (int)pWavWriter[index]->mRun;}__declspec(dllexport) int __cdecl Run(int index)//运行指定对象{pWavWriter[index]->Run();return 0;}__declspec(dllexport) int __cdecl Stop(int index)//停止指定对象{pWavWriter[index]->Stop();return 0;}__declspec(dllexport) int __cdecl Exit(int index)//退出指定对象{pWavWriter[index]->Exit();return 0;}__declspec(dllexport) int __cdecl DestroyAll()//销毁所有对象{for (int i = 0; i <= mNu; i++){delete pWavWriter[i];}return 0;}#ifdef __cplusplus
}
#endif
相关文章:
Windows软件插件-写wav
下载本插件 本插件,将PCM音频流写入WAV音频文件。或将PCM音频流压缩为ALAW格式,写入WAV文件。可以创作大文件(超过4字节所能表示的大小)。插件类型为DLL,可以在win32和MFC程序中使用。使用本插件创建的ALAW格式WAV音频…...
基于 Spring Boot 瑞吉外卖系统开发(十五)
基于 Spring Boot 瑞吉外卖系统开发(十五) 前台用户登录 在登录页面输入验证码,单击“登录”按钮,页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…...
【Linux高级IO】多路转接之epoll
多路复用之epoll 一,认识epoll二,epoll的相关接口1. epoll_create2. epoll_ctl3. epoll_wait 三,epoll的原理四,epoll的两种工作模式(ET和LT)1. 两种工作模式2. 对比ET和LT 五,总结 在了解到sel…...
Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践
引言 在高并发、低延迟的技术场景中,Java 性能优化需要系统化的方法论支撑。本文基于7 大核心优化方向(复用优化、计算优化、结果集优化、资源冲突优化、算法优化、高效实现、JVM 优化),结合权威框架与真实案例,构建从…...
“海外滴滴”Uber的Arm迁移实录:重构大规模基础设施
云工作负载在性价比上的自然演进路径: Intel ➜ AMD ➜ ARM 不信?来看看 Uber 的做法: 01/Arm架构:云计算新时代 2023 年 2 月,Uber 正式开启了一项战略性迁移:将从本地数据中心迁移至云端,…...
java加强 -File
File类的对象可以代表文件/文件夹,并可以调用其提供的方法对象文件进行操作。 File对象既可以代表文件,也可以代表文件夹。 创建File对象,获取某个文件的信息 语法: File 对象名 new File("需要访问文件的绝对路径&…...
SQL注入 ---04
1 简单的sql注入 要求: 要有sql注入: 1,变量 2,变量要带入数据库进行查询 3,没有对变量进行过滤或者过滤不严谨 mysql> select * from users where id2 limit 0,1; 当我的语句这样写时查寻到的结果 当我修改为&…...
MySQL知识点总结(持续更新)
聚合函数通常用于对数据进行统计和聚合操作。以下是一些常见数据库系统(如 MySQL、PostgreSQL、Oracle、SQL Server 等)中常用的聚合函数: 常见的数据库聚合函数: COUNT():计算指定列中非空值的数量 SELECT COUNT(*) …...
数字信号处理-大实验1.1
MATLAB仿真实验目录 验证实验:常见离散信号产生和实现验证实验:离散系统的时域分析应用实验:语音信号的基音周期(频率)测定 目录 一、常见离散信号产生和实现 1.1 实验目的 1.2 实验要求与内容 1.3 实验…...
Qt操作SQLite数据库教程
Qt 中操作 SQLite 数据库的步骤如下: 1. 添加 SQLite 驱动并打开数据库 #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery>// 创建数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QSQLITE"); db.setData…...
【PSINS工具箱】基于工具箱的单独GNSS导航、单独INS导航、两者结合组合导航,三种导航的对比程序。附完整的代码
本文给出基于PSINS工具箱的单独GNSS导航、单独INS导航、两者结合组合导航(153EKF)的程序。并提供三者的轨迹对比、误差对比。 文章目录 运行结果MATLAB代码代码的简单介绍简介2. 平均绝对误差 (MAE)主要模块运行结果 三轴轨迹图: 各轴误差曲线: 命令行窗口的结果输出: …...
开发者的测试复盘:架构分层测试策略与工具链闭环设计实战
摘要 针对测试复盘流于形式、覆盖率虚高等行业痛点,本文提出一套结合架构分层与工具链闭环的解决方案: 分层测试策略精准化:通过单元测试精准狙击核心逻辑、契约测试驱动接口稳定性、黄金链路固化端到端场景,实现缺陷拦截率…...
手写CString类
学习和理解字符串处理机制:手写 CString 类是深入学习字符串处理和内存管理的有效方式。通过实现构造函数、析构函数、赋值运算符等,能够理解字符串在内存中的存储方式、动态内存分配和释放的原理,以及如何处理字符串的复制、拼接、查找等操作…...
electron结合vue,直接访问静态文件如何跳转访问路径
在最外的app.vue或者index.vue的js模块编写 let refdade ref(1);//刷新,获得请求// 获取完整的查询字符串(例如: "?dade/myms")const searchParams new URLSearchParams(window.location.search);// 获取 dade 参数的值…...
解读RTOS 第七篇 · 驱动框架与中间件集成
1. 引言 在面向生产环境的 RTOS 系统中,硬件驱动框架与中间件层是连接底层外设与上层应用的桥梁。一个模块化、可扩展的驱动框架能够简化外设管理,提升代码可维护性;而丰富的中间件生态则为网络通信、文件系统、图形界面、安全加密等功能提供开箱即用的支持。本章将从驱动模…...
Java GUI开发全攻略:Swing、JavaFX与AWT
Swing 界面开发 Swing 是 Java 中用于创建图形用户界面(GUI)的库。它提供了丰富的组件,如按钮、文本框、标签等。 import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class SwingExa…...
Cursor 0.5版本发布,新功能介绍
Cursor,这款流行的AI编程平台,刚刚在其v0.50更新中推出了一系列新功能。 首先,请将您的Cursor IDE更新到最新版本。当您打开Cursor时,您应该会在屏幕左下方收到关于最新版本发布的通知。 更多上下文控制: 对上下文的精细可见性,以及最新模型的MAX模式。 聊天升级: 导出…...
Android学习总结之Glide自定义三级缓存(实战篇)
一、为什么需要三级缓存 内存缓存(Memory Cache) 内存缓存旨在快速显示刚浏览过的图片,例如在滑动列表时来回切换的图片。在 Glide 中,内存缓存使用 LruCache 算法(最近最少使用),能自动清理长…...
Maven 下载安装与配置教程
## 1. Maven 简介 Maven 是一个项目管理和构建自动化工具,主要用于 Java 项目。Maven 可以帮助开发者管理项目的构建、报告和文档,简化项目依赖管理。 ## 2. 下载 Maven 1. 访问 Maven 官方网站 [https://maven.apache.org/download.cgi](https://maven.…...
一篇解决Redis:持久化机制
目录 认识持久化 持久化方案 RDB(Redis DataBase) 手动触发 自动触发 小结 AOF(Append-Only File) AOF缓冲区刷新机制 AOF重写机制 AOF重写流程 编辑 混合持久化 认识持久化 我们都知道Mysql有四大特征,原子性,持久…...
使用IDEA创建Maven版本的web项目以及lombok的使用
1.新建项目 2.修改pom.xml 3.修改项目结构 4.在main/java下面写一个Servlet测试一下 然后当前页面往下滑 -Dfile.encodingUTF-8编写一句输出语句,测试是否成功部署配置,并选择到正确的位置: 回车以后 再回到idea里面,发现控…...
2025年AI开发者在开发者占比?
AI开发者在全球开发者中的占比目前没有一个统一且精确的数值,但根据行业报告和调研数据,可以给出以下大致的范围和趋势分析: 1. 综合估算范围 全球范围:AI/ML(机器学习)开发者约占开发者总数的 5%-15%&…...
SpringBoot整合MQTT实战:基于EMQX构建高可靠物联网通信,从零到一实现设备云端双向对话
一、引言 随着物联网(IoT)技术的快速发展,MQTT(Message Queuing Telemetry Transport)协议因其轻量级、低功耗和高效的特点,已成为物联网设备通信的事实标准。本文将详细介绍如何使用SpringBoot框架整合MQTT协议,基于开源MQTT代理EMQX实现设…...
Windows更新暂停七天关键注册表
环境:windows10 工具:procmon 下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procmon 监控截图: 界面截图: 注: 1.北京时间差8小时 2.至少是从第二天恢复,即至少暂停…...
小白学习java第18天(上):spring
Spring :是一个轻量级(一个小依赖就可以实现还不是轻量级)的控制反转(IOC)和面向切面编程(AOP)的框架! 优点: 1.Spring 是一个开源免费的框架(容器…...
用Array.from实现创建一个1-100的数组
一、代码实现 let arr Array.from({length: 100}, (_, i) > i 1); 二、代码分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 类数组对象(如 { length: 100 })本身没有索引属性(如 0: undefined, 1: undefi…...
什么是物联网 IoT 平台?
目录 物联网IoT平台的定义 物联网 IoT 平台发展历程 物联网IoT平台数据的特征 物联网IoT平台的处理流程 专为物联网 IoT 平台处理而生的时序数据库 物联网 IoT 平台时序数据处理面临的挑战及解决方案 收益与价值 物联网 IoT 平台企业案例 至数摇光 x TDengine 华自科技…...
PostgREST:无需后端 快速构建RESTful API服务
在现代 Web 开发中,API 已成为连接前后端的核心桥梁,传统的做法是通过后端框架来构建API接口,然后由前后端人员进行联调。 PostgREST是基于无服务器的一种实现方案,允许开发者将PostgreSQL数据库直接暴露为RESTful API࿰…...
3天北京旅游规划
北京 第一天应该集中在故宫和市中心区域,比如天安门、人民广场。这样可以体验到北京的历史和政治文化。午餐推荐烤鸭,因为这可是北京的特色。下午可以安排南锣鼓巷,既有古色古香的胡同,又有丰富的美食选择。 第二天的话࿰…...
MySQL--day1--数据库概述
(以下内容全部来自上述课程) 概述 1. 为什么要用数据库 持久化:内存中的数据断电之后就不存在了,所以需要持久化–>需要相关介质。 其中的一个介质就是数据库:存储数据量大、存储数据类型多 2. 数据库与数据库…...
[思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?
一、什么是事物的关系? 事物的关系是指不同事物之间存在的各种联系和相互作用,它反映了事物之间的相互依存、相互影响、相互制约等特性。以下从不同维度为你详细阐述: 1、关系的类型 因果关系 定义:一个事件(原因&a…...
图像识别与 OCR 应用实践
图像识别是一种让计算机具备“看”与“理解”图像能力的人工智能技术,其目标是从图像或视频中提取有意义的信息,如物体、人物、场景或文字。在现实生活中,这项技术被广泛应用于面部识别、自动驾驶、安防监控、医疗诊断、图像搜索等多个领域。…...
深入理解卷积神经网络:从基础原理到实战应用
在人工智能领域,卷积神经网络(Convolutional Neural Network,简称 CNN)凭借其强大的图像识别、处理能力,成为深度学习中不可或缺的技术。无论是自动驾驶汽车识别道路标志,还是医学影像分析辅助疾病诊断&…...
51单片机——交通指示灯控制器设计
设计目标 1、设计一交通灯控制,控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。 2、可手动控制和自动控制,设置两个输入控制开关。 手动/自动开关,通过P11的按键输入控制 3、手动:设置开关P11,两种情况&#x…...
vue2 头像上传+裁剪组件封装
背景:最近在进行公司业务开发时,遇到了头像上传限制尺寸的需求,即限制为一寸证件照(宽295像素,高413像素)。 用到的第三方库: "vue-cropper": "^0.5.5" 完整组件代码&…...
面向对象设计模式之代理模式详解
文章目录 面向对象设计模式之代理模式详解面向对象思想:现代软件开发的基石代理模式:巧妙的中间层设计JavaScript 语法点与代理模式的结合JavaScript 实现代理模式示例代理模式的应用场景 面向对象设计模式之代理模式详解 在现代软件开发的浩瀚领域中&a…...
Leetcode209做题笔记
力扣209 题目分析:想象一个窗口遍历着这个数组,不断扩大右边界,让r。往窗口中添加数字: 此时我们找到了这个窗口,它的和满足了大于等于target的条件,题目让我求最短的,那么我们就尝试来缩短它&…...
SVG 知识详解:从入门到精通
SVG 知识详解:从入门到精通 作为一名前端开发者,我经常会被SVG的魅力所折服。这种基于XML的矢量图形格式,不仅能完美适配各种屏幕分辨率,还能通过CSS和JavaScript进行灵活控制。今天,就让我们一起来深入探索SVG的世界…...
编译openssl源码
openssl版本 1.1.1c windows 安装环境 perl 先安装perl,生成makefile需要 https://strawberryperl.com/releases.html nasm nasm 也是生成makefile需要 https://www.nasm.us/ 安装完perl输入一下nasm,看看能不能找到,找不到的话需要配…...
土壤温湿盐分传感器用于节水农业灌溉引领者三针设计原理便于安装维护
土壤温度部分是由精密铂电阻和高精度变送器两部分组成。变送器部分由电源模块、温度传感模块、变送模块、温度补偿模块及数据处理模块等组成,彻底解决铂电阻因自身特点导入的测量误差,变送器内有零漂电路和温度补偿电路,对使用环境有较高的适…...
Kotlin Compose 与传统 Android UI 开发对比
在移动应用开发领域,Android 开发一直是技术演进的前沿阵地,而 UI 开发作为用户与应用交互的核心环节,其技术体系的变革更是备受瞩目。 技术演进背景 Android UI 开发体系发展脉络 原生 View 体系阶段 在早期的 Android 开发中,原生 View 体系占据了主导地位。开发者通…...
docker-compose——安装redis
文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…...
MFC 调用海康相机进行软触发
初始化相机类文件 #pragma once #include "MvCameraControl.h" class CMvCamera { public:CMvCamera();~CMvCamera();//初始化相机int InitCamera();int SaveCurrentImage(CString filePath);//关闭相机void CloseCamera();//设置int SetEnumValue(IN const char* s…...
第二章 变量和运算符
主要内容 关键字和标识符变量和常量八大基本数据类型Scanner键盘输入基本数据类型的类型转换算术运算符赋值运算符扩展赋值运算符比较运算符逻辑运算符三目运算符运算符的优先级别 学习目标 知识点要求关键字和标识符理解变量和常量掌握八大基本数据类型掌握Scanner键盘输入…...
【starrocks】StarRocks 常见 HTTP 操作与导入错误排查指南
文章目录 一、Stream Load:通过 HTTP 导入数据二、导入状态查询三、取消导入任务四、节点状态监控查看所有 Backend 状态:查看所有 Frontend 状态: 五、导入失败的排查方式1. 查询导入任务状态2. 下载详细错误日志3. 查看 FE/BE 节点日志FE 日…...
网络协议分析 实验七 FTP、HTTP、DHCP
文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下,上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…...
ET ProcessInnerSender类(实体) 分析
ProcessInnerSender 作用是进程内部发送Actor消息 字段 TIMEOUT_TIME 超时时间RpcId 用来累加requestCallback 存储RPC的回调事件list 用来获取MessageQueue中的Actor消息 方法 Awake 初始化在MessageQueue中注册待处理的消息队列Destroy 移除在MessageQueue中的消息队列U…...
远程连接工具
绿色轻便ToDesk https://www.todesk.com/download.html 向日葵 https://sunlogin.oray.com/download...
MySQL库级管理:数据库管理与存储引擎剖析
引言 各位数据库爱好者们好!今天我们要深入探讨MySQL数据库的基本操作,这是每位开发者必须掌握的"内功心法" 💪。无论你是刚接触MySQL的小白,还是需要复习基础的老手,这篇教程都将带你系统学习数据库的核心…...
MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?
MongoDB 是一个面向文档的数据库,它的核心概念与传统的关系型数据库(RDBMS)有所不同。以下是它的四个主要核心概念: 文档 (Document) 定义: 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…...