wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连
🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️
文章目录
- 问题一:wav格式的音频压缩为哪些格式,网络传输给用户播放会快
- 回答
- 一、精选推荐方案
- 1. **Opus**(首选方案)
- 2. **AAC-LC**(兼容性最优)
- 3. **MP3 VBR**(最广泛支持)
- 二、性能对比数据(WAV→目标格式) - 体积压缩比
- 三、场景化参数指南
- 语音场景(电话级音质)
- 音乐场景(CD级音质)
- 四、进阶优化技巧
- 五、格式选择决策树
- 六、实时监控建议
- 使用 ffmpeg 工具 将 WAV 音频格式进行转换命令总结
- WAV 与 m4a、mp3、opus 格式音频大小实测对比
- WAV 与 m4a、mp3、opus 格式音频 码率、声道、采样率分析
- 码率 大小,很大程度影响了 音频体积大小
- 问题二 : MP3格式音频,码率、采样率、声道数 可以设置为多少,音质也不会下降太多 ?
- 回答
- 1. 核心参数推荐组合
- 2. 参数详解与优化指南
- **▶ 码率(Bitrate)**
- **▶ 采样率(Sample Rate)**
- **▶ 声道数(Channels)**
- 3. 黄金参数组合
- 多个 MP3 格式音频合并为一个
- 文件夹存在则删除重建,不存在则直接建立
- FFmpeg : 管道拼接的方式 【目前采用】
- FFmpeg : 创建临时文件列表(FFmpeg专用格式)
- 📙 精选专栏
问题一:wav格式的音频压缩为哪些格式,网络传输给用户播放会快
- 有请 deepseek 来告诉我们答案
回答
以下是针对网络传输优化的音频格式转换方案,按优先级排序:
一、精选推荐方案
1. Opus(首选方案)
ffmpeg -i input.wav -c:a libopus -b:a 48k -vbr on output.opus
优势:
- 超低延迟(最小5ms)
- 最佳压缩率(相同音质下体积比MP3小30%)
- 支持动态码率调节(6kbps到510kbps)
- 完美支持WebRTC实时传输
适用场景:视频会议、直播、在线教育
2. AAC-LC(兼容性最优)
ffmpeg -i input.wav -c:a aac -b:a 64k -profile:a aac_low output.m4a
优势:
- 100%兼容iOS/Android
- 支持HLS流媒体协议
- 可硬件解码降低设备功耗
适用场景:移动端APP、短视频平台
3. MP3 VBR(最广泛支持)
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
优势:
- 兼容所有老旧设备
- q=2参数对应170-210kbps动态码率
- 支持ID3元数据标签
适用场景:音乐网站、播客平台
二、性能对比数据(WAV→目标格式) - 体积压缩比
格式 | 码率 | 体积缩减比 | 解码CPU占用 | 浏览器支持率 |
---|---|---|---|---|
WAV | 1411kbps | 100% | 5% | 100% |
Opus | 48kbps | 3.3% | 8% | 92% |
AAC-LC | 64kbps | 4.5% | 10% | 100% |
MP3 VBR | 190kbps | 13.5% | 15% | 100% |
三、场景化参数指南
语音场景(电话级音质)
ffmpeg -i input.wav -c:a libopus -b:a 16k -compression_level 10 \-application voip output.opus
- 单声道模式
- 采样率降为16kHz
- 开启语音优化算法
音乐场景(CD级音质)
ffmpeg -i input.wav -c:a aac -b:a 192k -cutoff 20000 \-movflags +faststart output.m4a
- 保持44.1kHz采样率
- 开启高频保留(cutoff)
- 添加MP4快速播放头
四、进阶优化技巧
- 分片传输:
# 使用MP4分段
ffmpeg -i input.wav -c:a aac -f segment -segment_time 10 output_%03d.m4s
- 预加载策略:
<audio preload="metadata"><source src="audio.opus" type="audio/ogg; codecs=opus">
</audio>
- 压缩加速:
# 启用多线程编码
ffmpeg -threads 4 -i input.wav -c:a libopus -b:a 48k output.opus
五、格式选择决策树
六、实时监控建议
部署音频传输质量监控:
# 使用Web Audio API检测卡顿
const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();
analyser.addEventListener('audioprocess', (e) => {if(e.timeStamp - lastTime > 200) {console.warn('Audio jitter detected');}
});
最终推荐方案:优先使用Opus格式,配合AAC作为兼容性备选。对于音乐类内容推荐AAC 192kbps,语音场景使用Opus 32kbps,可兼顾音质与传输效率。
使用 ffmpeg 工具 将 WAV 音频格式进行转换命令总结
1. Opus(首选方案)
ffmpeg -i input.wav -c:a libopus -b:a 48k -vbr on output.opusffmpeg -i 20250226_102045_416_1.wav -c:a libopus -b:a 48k -vbr on output.opus
2. AAC-LC(兼容性最优)
ffmpeg -i input.wav -c:a aac -b:a 64k -profile:a aac_low output.m4a
3. MP3 VBR(最广泛支持)
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
WAV 与 m4a、mp3、opus 格式音频大小实测对比
原因是我在音频转换时,指定的码率不一致
du -sh *1.2M 20250226_112605_801_1.wav
764K 20250226_112605_801_2.wav
840K 20250226_112605_801_3.wav
652K 20250226_112605_801_4.wav
948K 20250226_112605_801_5.wav
952K 20250226_112605_801_6.wav232K 20250226_141132_332_1.m4a
148K 20250226_141132_332_2.m4a
164K 20250226_141132_332_3.m4a
128K 20250226_141132_332_4.m4a
184K 20250226_141132_332_5.m4a
188K 20250226_141132_332_6.m4a100K 20250226_141716_930_1.mp3
64K 20250226_141716_930_2.mp3
72K 20250226_141716_930_3.mp3
56K 20250226_141716_930_4.mp3
80K 20250226_141716_930_5.mp3
80K 20250226_141716_930_6.mp3224K 20250226_142256_236_1.opus
140K 20250226_142256_236_2.opus
156K 20250226_142256_236_3.opus
120K 20250226_142256_236_4.opus
180K 20250226_142256_236_5.opus
176K 20250226_142256_236_6.opus
WAV 与 m4a、mp3、opus 格式音频 码率、声道、采样率分析
代码如下
"""Audio format analysistime python audio_format_analysis.py
"""import os
import subprocess
import csv
from collections import defaultdictdef get_audio_metadata(file_path):"""使用ffprobe获取音频元数据"""cmd = ['ffprobe', '-v', 'error','-select_streams', 'a:0','-show_entries', 'stream=channels,sample_rate : format=bit_rate,duration','-of', 'default=noprint_wrappers=1',file_path]try:result = subprocess.run(cmd, capture_output=True, text=True, check=True)metadata = {}for line in result.stdout.split('\n'):if '=' in line:key, value = line.split('=', 1)metadata[key] = valuereturn {'channels': int(metadata.get('channels', 0)),'sample_rate': int(metadata.get('sample_rate', 0)),'bit_rate': int(metadata.get('bit_rate', 0)),'duration': float(metadata.get('duration', 0))}except Exception as e:print(f"分析失败: {file_path} - {str(e)}")return Nonedef analyze_audio_directory(directory):results = []for filename in os.listdir(directory):if filename.lower().endswith(('.wav', '.m4a', '.mp3', '.opus')):file_path = os.path.join(directory, filename)metadata = get_audio_metadata(file_path)if metadata:file_size = os.path.getsize(file_path) / 1024 # KBresults.append({'filename': filename,'format': os.path.splitext(filename)[1][1:].upper(),'size_kb': round(file_size, 1),'channels': metadata['channels'],'bit_rate_kbps': round(metadata['bit_rate'] / 1000),'duration_sec': round(metadata['duration'], 1),'sample_rate': metadata['sample_rate']})return resultsdef save_to_csv(data, output_file):with open(output_file, 'w', newline='') as csvfile:fieldnames = ['filename', 'format', 'size_kb', 'channels', 'bit_rate_kbps', 'duration_sec', 'sample_rate']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()for row in data:writer.writerow(row)if __name__ == '__main__':# 使用示例audio_dir = './tts_save_audios' # 替换为实际路径output_csv = 'audio_analysis.csv'analysis_data = analyze_audio_directory(audio_dir)save_to_csv(analysis_data, output_csv)# 打印统计摘要format_stats = defaultdict(list)for item in analysis_data:format_stats[item['format']].append(item)print("\n格式统计摘要:")for fmt, items in format_stats.items():avg_bitrate = sum(i['bit_rate_kbps'] for i in items) / len(items)avg_channels = sum(i['channels'] for i in items) / len(items)print(f"{fmt}格式:")print(f" • 平均码率:{avg_bitrate:.1f} kbps")print(f" • 平均声道数:{avg_channels:.1f}")print(f" • 文件数量:{len(items)}")print(" • 采样率分布:" + ', '.join(str(i['sample_rate']) for i in items))
码率 大小,很大程度影响了 音频体积大小
输出如下
time python audio_format_analysis.py格式统计摘要:
M4A格式:• 平均码率:74.5 kbps• 平均声道数:1.0• 文件数量:6• 采样率分布:24000, 24000, 24000, 24000, 24000, 24000
WAV格式:• 平均码率:384.0 kbps• 平均声道数:1.0• 文件数量:6• 采样率分布:24000, 24000, 24000, 24000, 24000, 24000
MP3格式:• 平均码率:32.0 kbps• 平均声道数:1.0• 文件数量:6• 采样率分布:24000, 24000, 24000, 24000, 24000, 24000
OPUS格式:• 平均码率:70.7 kbps• 平均声道数:1.0• 文件数量:6• 采样率分布:48000, 48000, 48000, 48000, 48000, 48000real 0m0.936s
问题二 : MP3格式音频,码率、采样率、声道数 可以设置为多少,音质也不会下降太多 ?
- 核心答案:【| 语音录音 | 64kbps VBR / 32kHz / Mono | 清晰人声
| 0.5MB/分钟 |】
回答
在保证音质的前提下优化MP3文件体积时,参数设置建议如下(附技术原理说明):
1. 核心参数推荐组合
参数类型 | 推荐值 | 适用场景 |
---|---|---|
码率 | 128-192kbps (CBR) 或 VBR V0-V2 | 音乐/语音通用 |
采样率 | 44.1kHz(保持源文件采样率) | 所有场景 |
声道数 | 立体声(Stereo) / 单声道(Mono) | 音乐用立体声,语音用单声道 |
2. 参数详解与优化指南
▶ 码率(Bitrate)
- 128kbps:基础阈值(CD音质的1/11体积),人耳可感知轻微细节损失
- 160kbps:平衡点(适合流行音乐),文件体积比128kbps大25%
- 192kbps:准无损阈值(古典音乐适用),高频保留更完整
- VBR模式:动态码率(推荐V0=~245kbps峰值),比CBR节省30%体积
技术原理:
MP3采用听觉掩蔽效应编码,当码率≥128kbps时:
- 保留20Hz-16kHz频率范围(人类听觉范围20Hz-20kHz)
- 16kHz以上的高频细节会逐渐丢失
▶ 采样率(Sample Rate)
- 44.1kHz:CD标准(最高还原22.05kHz声音)
- 48kHz:影视工业标准(不建议转换已有音频)
- 32kHz:电话语音质量(文件体积减少27%)
优化技巧:
保持原始采样率,避免重复采样转换造成的相位失真。
▶ 声道数(Channels)
- 立体声→单声道:文件体积直接减半(适合播客/语音)
- 联合立体声(Joint Stereo):比普通立体声节省15%体积
音质对比:
音乐用立体声(空间感保留),语音用单声道(无感知差异)
3. 黄金参数组合
场景 | 推荐参数 | 音质评价 | 文件体积对比 |
---|---|---|---|
音乐存储 | 192kbps CBR / 44.1kHz / Stereo | 接近CD品质 | 5MB/分钟 |
语音录音 | 64kbps VBR / 32kHz / Mono | 清晰人声 | 0.5MB/分钟 |
移动设备 | 128kbps CBR / 44.1kHz / Stereo | 通用兼容方案 | 3MB/分钟 |
高保真存档 | 320kbps VBR / 48kHz / Stereo | 专业级保留 | 7.5MB/分钟 |
最终结论:
对大多数用户而言,192kbps VBR + 44.1kHz + 立体声是最佳平衡点,可在保持90%以上音质的同时,将文件体积控制在原始WAV的10%左右。
多个 MP3 格式音频合并为一个
文件夹存在则删除重建,不存在则直接建立
import os
import shutilres_folder = 'results'
if os.path.exists(res_folder):shutil.rmtree(res_folder)
os.makedirs(res_folder)
FFmpeg : 管道拼接的方式 【目前采用】
import os
import subprocess
from datetime import datetime"""
# 管道拼接的方式要求输入的音频,通道数、码率、采样率等 指标格式一致type(concat_input) : <class 'str'>concat_input : tts_save_audios/20250226_180203_807/20250226_180203_807_1.mp3|tts_save_audios/20250226_180203_807/20250226_180203_807_6.mp3
"""# ---------- 关键修复步骤 ----------
def merge_audios_with_ffmpeg(input_files, output_file):"""使用FFmpeg合并音频文件"""# 1. 检查所有输入文件是否存在for file in input_files:if not os.path.exists(file):raise FileNotFoundError(f"音频文件不存在: {file}")# 2. 转义路径中的特殊字符(如空格、括号等)# 将路径中的反斜杠统一为正斜杠(避免Windows路径问题)escaped_files = [f.replace('\\', '/') for f in input_files]concat_input = '|'.join(escaped_files)print(f'\n✅type(concat_input) : {type(concat_input)} \n✅concat_input : {concat_input}\n')# 3. 构建FFmpeg命令(保持编码一致)cmd = ['ffmpeg','-y', # 覆盖输出文件'-i', f'concat:{concat_input}','-acodec', 'copy', # 直接复制流,不重新编码'-loglevel', 'error', # 仅输出错误信息output_file]# 4. 执行并捕获错误详情try:result = subprocess.run(cmd,stderr=subprocess.PIPE,stdout=subprocess.PIPE,text=True # 兼容Python 3.7+)if result.returncode != 0:raise RuntimeError(f"FFmpeg合并失败: {result.stderr}")except Exception as e:raise RuntimeError(f"合并异常: {str(e)}")if __name__ == "__main__":sorted_audio_list = ['tts_save_audios/20250226_180203_807/20250226_180203_807_1.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_2.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_3.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_4.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_5.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_6.mp3']# 获取当前时间(含微秒)now = datetime.now()timestamp = now.strftime("%Y%m%d_%H%M%S_%f")[:-3]save_dir = 'tts_save_audios'# 确保目录存在(自动创建多层目录)os.makedirs(save_dir, exist_ok=True)output_merged_mp3 = os.path.join(save_dir, f'{timestamp}.mp3')# 调用合并函数merge_audios_with_ffmpeg(sorted_audio_list, output_merged_mp3)print(f"\n✅音频合并成功,保存至: {output_merged_mp3}")
FFmpeg : 创建临时文件列表(FFmpeg专用格式)
import os
import subprocess
from datetime import datetimedef merge_audios_with_ffmpeg(input_files, output_file):"""使用FFmpeg合并音频文件(修复版)"""# 1. 检查所有输入文件是否存在for file in input_files:if not os.path.exists(file):raise FileNotFoundError(f"音频文件不存在: {file}")# 2. 创建临时文件列表(FFmpeg专用格式)list_filename = "file_list.txt"with open(list_filename, "w", encoding="utf-8") as f:for file in input_files:# 转义路径中的特殊字符(统一使用正斜杠)file_escaped = file.replace("\\", "/")f.write(f"file '{file_escaped}'\n")# 3. 构建FFmpeg命令(使用 -f concat 和文件列表)# cmd = [# 'ffmpeg',# '-y', # 覆盖输出文件# '-f', 'concat', # 指定concat格式# '-safe', '0', # 允许非安全路径# '-i', list_filename, # 输入文件列表# '-c', 'copy', # 直接复制流,不重新编码# '-loglevel', 'error', # 仅输出错误信息# output_file# ]# 构建优化后的FFmpeg命令cmd = ["ffmpeg","-y", # 覆盖输出文件"-f", "concat","-safe", "0","-i", str(list_filename),"-c:a", "libmp3lame","-b:a", "32k", # 固定码率模式"-ac", "1", # 单声道"-ar", "24000", # 采样率"-joint_stereo", "0", # 禁用联合立体声"-compression_level", "0", # 禁用额外压缩"-write_xing", "0", # 移除Xing头"-id3v2_version", "0", # 保留原始ID3标签"-fflags", "+bitexact",str(output_file)]print(f'\n\n cmd : {cmd}\n\n')# 4. 执行并捕获错误try:result = subprocess.run(cmd,stderr=subprocess.PIPE,stdout=subprocess.PIPE,text=True)if result.returncode != 0:raise RuntimeError(f"FFmpeg合并失败: {result.stderr}")finally:# 无论成功与否,删除临时文件列表if os.path.exists(list_filename):os.remove(list_filename)if __name__ == "__main__":sorted_audio_list = ['tts_save_audios/20250226_180203_807/20250226_180203_807_1.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_2.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_3.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_4.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_5.mp3', 'tts_save_audios/20250226_180203_807/20250226_180203_807_6.mp3']# 获取当前时间(含微秒)now = datetime.now()timestamp = now.strftime("%Y%m%d_%H%M%S_%f")[:-3]save_dir = 'tts_save_audios'# 确保目录存在(自动创建多层目录)os.makedirs(save_dir, exist_ok=True)output_merged_mp3 = os.path.join(save_dir, f'{timestamp}.mp3')# 调用合并函数merge_audios_with_ffmpeg(sorted_audio_list, output_merged_mp3)print(f"音频合并成功,保存至: {output_merged_mp3}")
📙 精选专栏
- 🍊 深度学习模型训练推理——基础环境搭建推荐博文查阅顺序【基础安装—认真帮大家整理了】——【1024专刊】
计算机视觉领域 八大专栏、不少干货、有兴趣可了解一下
- ❤️ 图像风格转换 —— 代码环境搭建 实战教程【关注即可阅】!
- 💜 图像修复-代码环境搭建-知识总结 实战教程 【据说还行】
- 💙 超分重建-代码环境搭建-知识总结 解秘如何让白月光更清晰【脱单神器】
- 💛 YOLO专栏,只有实战,不讲道理 图像分类【建议收藏】!
-
🍊 深度学习:环境搭建,一文读懂
-
🍊 深度学习:趣学深度学习
-
🍊 落地部署应用:模型部署之转换-加速-封装
-
🍊 CV 和 语音数据集:数据集整理
-
🍊 点赞 👍 收藏 ⭐留言 📝 都是博主坚持写作、更新高质量博文的最大动力!
相关文章:
wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 问题一:wav格式的音频压缩为哪些格式,网络传输给用户播放…...
TDengine 中的数据库
数据库概念 时序数据库 TDengine 中数据库概念,等同于关系型数据库 MYSQL PostgreSQL 中的数据库,都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作,TDengine 数据库跨库操作除了少量几个SQL 能支持外&…...
react覆盖组件样式,不影响其他地方相同类名的组件
less module 配合 :global(){} less文件 /* ButtonComponent.less */ .customButton {// 覆盖第三方按钮库的类名(如 .ant-btn):global(.ant-btn) {background: #1890ff;// 通过父选择器限定作用域&:hover {background: #40a9ff;}} } tsx文件 //…...
ProtoBuf
protobuf 序列化 序列化:本质就是将结构化的数据转成为字符串(在网络HTTP中遇到过)protobuf:就是将结构化的数据进行序列化的一种方式。 特点 • 语⾔⽆关、平台⽆关:即 ProtoBuf ⽀持 Java、C、Python 等多种语⾔…...
算法day2 dfs搜索2题
一 PERKET 当我们拿到这个题目的时候,确实郁闷到底该怎么做,首先我们看这个题目 题目中给我们提供了这么多个调料,这个调料有酸度和苦度,这些都是它的属性,但是我们是选择这个调料,那么就是对于一个调料有…...
【数据分析】通过拟水平法,实现混合正交表
拟水平法是一种将高水平正交表转换为低水平正交表的方法,适用于实验中某些因素的水平数少于正交表水平数的情况。通过拟水平法,可以充分利用现有的正交表资源,减少实验次数。 1. 拟水平法的基本思想 拟水平法的核心是将高水平正交表中的某些水平“合并”或“拆分”,使其适…...
利用node.js搭配express框架写后端接口(一)
Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点,成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一,以其简洁的 API 和丰富的中间件生态系统,极大地简化了 Web 后端开发流程…...
python-leetcode-最长公共子序列
1143. 最长公共子序列 - 力扣(LeetCode) class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …...
【前端基础】Day 1 HTML
总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…...
Python解决“比赛配对”问题
Python解决“比赛配对”问题 问题描述测试样例解决思路代码 问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,…...
前端设计稿转代码工具深度评测:从效率革命到落地困境
前端设计稿转代码工具深度评测:从效率革命到落地困境 ——2025年主流工具横向对比与技术破局路径 一、工具演进史:从"机械翻译"到"AI设计师" 前端设计稿转代码工具经历了三个阶段进化:早期基于规则匹配的代码生成器(2015-2020)、智能布局识别工具(…...
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作, 实战开发 导入项目 我把得到的项目解压到本地,我们开…...
管理后台环境配置
1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl (管理员:wsl --install) redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…...
STM32寄存器控制引脚高低电平
一. 引子 最近在学习32代码的过程当中,虽然在学习IMX6ULL开发板的过程中接触过很多寄存器,最近在返回去看32的时候,在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻,所以下来的时候去查了资料,以及问了一…...
vue 设置生产 开发 测试环境
在 Vue.js 中,可以通过配置不同的环境变量来区分生产、开发和测试环境的请求。一般情况下,我们使用 webpack 或 Vite 进行构建,它们都支持环境变量的配置。 以下是如何在 Vue 项目中配置不同环境的请求: 1. 配置 .env 文件 在项…...
《模拟器过检测教程:Nox、雷电、Mumu、逍遥模拟器 Magisk、LSposed 框架安装与隐藏应用配置》
一、夜神模拟器 (Nox) 过检测 使用版本:7.0.6.2(20250209) 1. 准备工作 将需要用到的应用放入文件夹: C:\Users\Administrator.DESKTOP-I5V50SS\Nox_share\Download 2. 安装面具鸭(Magisk) 在模拟器下…...
Three.js包围盒
目录 前言 包围矩形Box2 包围盒Box3 包围球Sphere Box3方法.setFromPoints() 几何体方法.computeBoundingBox() 几何体居中方法center() Box3方法.expandByObject() Box3方法.expandByScalar() Box3方法.getSize() Box3方法.getCenter() Sphere方法.getBoundingSp…...
JBoltAI_SpringBoot 资源管理:打造一站式 AI 资源管理平台
在 AI 项目开发中,资源管理一直是个让人头疼的问题。各种模型、数据库、嵌入资源等,如果没有一个统一的管理平台,很容易让开发者陷入混乱。今天,就给大家介绍一个超级实用的资源管理功能 ——JBoltAI_SpringBoot 资源管理…...
Vue2+Element实现Excel文件上传下载预览【超详细图解】
目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后ÿ…...
迪米特法则
迪米特法则 迪米特法则又叫最少知识原则。 只和你的直接朋友交流,不和 ‘陌生人’ 说话。 含义:如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度ÿ…...
【Swift 算法实战】判断数组中是否存在重复元素
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
机器学习数学基础:35.效度
效度全攻略:从理论到实践的深度剖析 一、效度(Validity)入门:揭开精准测量的面纱 效度,简单来说,就是测量工具能否准确命中目标的“命中率”。想象你手中有一把枪(测量工具)&#…...
excel单、双字节字符转换函数(中英文输入法符号转换)
在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节,ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入,如英文字母,英文输入法…...
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备 1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤 2.1 创建实体类2.2 创建 Reposit…...
Jenkinsfile流水线构建教程
前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...
比创达电子科技-EMC干货之防静电技术
EMC干货之防静电技术 什么是静电放电 两个具有不同静电电位的物体,由于直接接触或静电场感应引起两物体间的静电电荷的转移,静电电场的能量达到一定程度后,击穿其间介质而进行放电的现象就是静电放电,简称为ESD(Electro Static Discharge)。 静电产生的原…...
PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍
2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…...
算法教程:岛的最大面积
算法教程:岛的最大面积 我们将首先讨论问题和解决方案,然后使用可视化工具(上一篇博客中进行了介绍)来更好地理解搜索过程。 问题描述 我们将要演练的具体问题是问题 Leetcode:岛屿的最大面积。在 Leetcode 上找到的直接问题描述是: 给你一个 m x n 二进制矩阵网格。岛…...
18439二维前缀和
18439二维前缀和 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…...
information_schema.processlist 表详解
information_schema.processlist 表(或 SHOW PROCESSLIST; 命令)用于查看 MySQL 当前所有的连接进程,帮助管理员监控数据库活动并排查性能问题。以下是该表的字段及其具体含义: 🔹 information_schema.processlist 字段…...
数字化转型数据自动采集统计分析发那科(FANUC)数据采集
针对各类数控机床,特别是FANUC系列的数据自动采集需求,以下是一个综合性的解决方案,并详细说明了如何采集FANUC系列机床的各类数据。 一、数据采集方案概述 协议支持: 以适应不同数控机床的通信需求。 针对FANUC系列机床…...
olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...
【自学嵌入式(11)闪存文件系统的应用】
闪存文件系统的应用 闪存文件插件程序的配置上传程序实例一上传程序实例二——上传文件到ESP8266的程序 上篇文章简要了解了闪存文件系统的概念,相关头文件、类以及方法。但我们只尝试了向开发板中传输文本数据,对于更加复杂的内容(如一个界面、一个互动…...
Spring Cloud——路由网关Zuul
??? 哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!??? 【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。 【一心同学】博客…...
ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)
ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下: Attributes文件夹保存特性类或过滤器类定义,主要包括: …...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
web前端初学Angular由浅入深上手开发项目
Angular 是一个功能强大的前端框架,适合构建复杂的企业级应用。作为初学者,通过由浅入深的学习路径,可以快速上手并开发项目。以下是逐步学习 Angular 的指导: 1. 基础知识 (1) 了解 Angular Angular 是什么? Angul…...
5.10 P-Tuning v2:多层级提示编码的微调革新
P-Tuning v2:多层级提示编码的微调革新 一、技术架构解析 #mermaid-svg-4Wy6vkXZi67hY9PZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Wy6vkXZi67hY9PZ .error-icon{fill:#552222;}#mermaid-svg-4Wy6vkXZi67h…...
RuntimeWarning: invalid value encountered in scalar power在进行标量的幂运算时遇到了无效值
year_profit ((profit / initial_cash) ** (1 / yy) - 1) * 100 RuntimeWarning: invalid value encountered in scalar power 这个警告表示在执行标量幂运算 ((profit / initial_cash) ** (1 / yy) - 1) * 100 时遇到了无效值。常见的引发原因及解决办法如下: ###…...
LabVIEW同步数据采集功能
VI通过使用数据采集(DAQ)硬件系统,进行多通道同步采集,实时获取模拟信号数据。它利用外部时钟信号触发数据采集,支持连续采样模式,并将采集到的数据实时显示在波形图上,方便用户进行数据监控和分…...
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...
【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖,基本上绕不开一个架构“Medallion”, 它使得数据管理更为简单有效。ADB 通过…...
Golang——内存(内存管理、内存逃逸、垃圾回收 (GC) 机制)
大家好,这里是编程Cookbook。本文详细介绍Go内存相关的内容,包括内存管理、内存逃逸、垃圾回收 (GC) 机制的三色标记,写屏障。 文章目录 Go 的内存管理mspan && arenasarenasmspan mcachemcentralmheap内存分配逻辑内存回收逻辑优势内…...
关系型数据库的技术思路
一、网络协议 需要根据TCP协议设计一个客户端和服务器之间的命令响应协议。 1、服务端回复声明 2、客户端发送登录包 3、服务端返回登录结果 4、登录成功后进入命令阶段,否则退出。 二、每个连接用一个线程 服务器为每个客户端连接开启一个线程。 三、需要文件的随机…...
web安全——分析应用程序
文章目录 一、确定用户输入入口点二、确定服务端技术三、解析受攻击面 一、确定用户输入入口点 在检查枚举应用程序功能时生成的HTTP请求的过程中,用户输入入口点包括: URL文件路径 通常,在查询字符?之前的URL部分并不视为用户输入入口&am…...
数据库事务的基本要素(ACID)
数据库事务的基本要素(ACID) 在数据库管理系统(DBMS)中,事务(Transaction)是一个或多个数据库操作的集合,这些操作要么全部成功,要么全部失败。事务的目标是保证数据的一…...
server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)
从你提供的配置文件(应该是 Spring Boot 的 application.yml 或 application.properties 文件)来看,以下部分与会话超时时间相关: server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…...
Docker数据卷容器实战
数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器。 命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载…...
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南一、注册火山引擎账号二、RAG技术核心原理三、环境与工具准备1. 核心组件2. 依赖配…...
Java内存的堆(堆内、堆外)、栈含义理解笔记
一、核心概念区分 1. 内存中的堆(Heap)与栈(Stack) 栈内存 ▸ 用途:存储方法调用、局部变量、基本类型数据(如 int a 1) ▸ 特点: 线程私有,每个线程独立分配栈空间。…...