wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连
🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️

0-9

文章目录

  • 问题一: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占用浏览器支持率
WAV1411kbps100%5%100%
Opus48kbps3.3%8%92%
AAC-LC64kbps4.5%10%100%
MP3 VBR190kbps13.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快速播放头

四、进阶优化技巧

  1. 分片传输
# 使用MP4分段
ffmpeg -i input.wav -c:a aac -f segment -segment_time 10 output_%03d.m4s
  1. 预加载策略
<audio preload="metadata"><source src="audio.opus" type="audio/ogg; codecs=opus">
</audio>
  1. 压缩加速
# 启用多线程编码
ffmpeg -threads 4 -i input.wav -c:a libopus -b:a 48k output.opus

五、格式选择决策树

苹果设备
老旧设备
现代浏览器
需要WebRTC支持?
Opus
目标设备类型?
AAC
MP3
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 和 语音数据集:数据集整理

  • 🍊 点赞 👍 收藏 ⭐留言 📝 都是博主坚持写作、更新高质量博文的最大动力!

9-9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC线程

创建线程 HANDLE m_hThread; m_hThread CreateThread(NULL, 0, save_snapshot, (LPVOID)this, 0, &iThreadId);开启线程循环等待 DWORD WINAPI save_snapshot(LPVOID pVoid) {while (true){//持续循环等待事件到达。接收到事件信号后才进入if。if (::WaitForSingleObjec…

赋能农业数字化转型 雏森科技助力“聚农拼”平台建设

赋能农业数字化转型&#xff0c;雏森科技助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天&#xff0c;农业领域也在积极探索转型升级之路。中农集团一直以“根植大地&#xff0c;服务三农”为核心&#xff0c;以“乡村振兴&#xff0c;农民增收”为目标&#xff0c;及时…

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的&#xff0c;如果想让一般的数据也可以得到状态的保存&#xff0c;可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…

Ubuntu20.04安装Redis

1.切换到root用户 如果没有切换到root用户的&#xff0c;切换到root用户。 2.使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之后就自动启动起来了&#xff0c;因此我们可以通过netstat -anp | grep redis命令来查看是否安装成功。 6379是Redis的默认端…

鸿蒙-AVPlayer

compileVersion 5.0.2&#xff08;14&#xff09; 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…

机器学习数学通关指南——泰勒公式

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 泰勒公式是用多…

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天&#xff0c;我们已经介绍了多线程的一些基础知识&#xff0c;包括如何创建工作队列以及如何在线程中处理任务。今天&#xff0c;重点是解决那些我们之前没有注意到…

在MacOS上打造本地部署的大模型知识库(一)

一、在MacOS上安装Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama&#xff0c;就能在webui中加载llama模…

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…

大模型RAG(检索增强)创新--SELF-RAG

检索增强生成 (RAG) 提供了一种将 ChatGPT/GPT-4 等大型语言模型与自定义数据集成的途径&#xff0c;但存在局限性。让我们看看 RAG 最近的研究是如何解决一些问题。 大语言模型(LLM)将改变整个金融领域。其中一个场景是大语言模型可以学习大量文档&#xff0c;并在很短的时间内…

《AI和人工智能和编程日报》

OpenAI&#xff1a;将深度研究扩展到 ChatGPT Plus、Team、Edu 和 Enterprise 用户&#xff0c;每月 10 次查询&#xff1b;Pro 用户每月有 120 次查询&#xff0c;ChatGPT 语音模式向免费用户开放。DeepSeek&#xff1a;R1 大模型宣布降价&#xff0c;调用价格将至四分之一&am…

【音视频】编解码相关概念总结

NALU RTP PS流 三者总体关系 NALU在RTP中的应用&#xff1a;视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU&#xff0c;这些NALU包含了视频编码数据。RTP协议通过其头部信息&#xff08;如时间戳、序列号等&#xff09;帮助接收端重新排列和…

端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port

文章目录 需求&#xff1a;A机器是内网机器&#xff0c;B机器是公网服务器&#xff0c;想要从公网&#xff0c;访问A机器的端口方式&#xff1a;端口映射&#xff0c;内网穿透&#xff0c;使用ssh打洞端口&#xff1a;遇到问题&#xff1a;命令执行成功&#xff0c;但是端口转发…

11特殊函数

一、递归函数 递归概念&#xff1a;如果一个函数内部&#xff0c;包含了对自身的调用&#xff0c;则该函数称为递归函数。要点&#xff1a; 只有能被表达为递归的问题&#xff0c;才能用递归函数解决。递归函数必须有一个可直接退出的条件&#xff0c;否则会进入无限递归。递归…

如何使用useContext进行全局状态管理?

在 React 中&#xff0c;使用 useContext 进行全局状态管理是一种有效的方法&#xff0c;尤其在需要在多个组件之间共享状态时。useContext 允许你在组件树中传递数据&#xff0c;而无需通过每个组件的 props 逐层传递。以下是关于如何使用 useContext 进行全局状态管理的详细指…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏&#xff0c;本文将通过鸿蒙 ArkUI 框架的实现代码&#xff0c;逐步解析其核心技术点&#xff0c;包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块&#xff1a; ├── entry…

神经性肺纤维的预防方法

神经性肺纤维的预防方法 一、引言 神经性肺纤维化是一种慢性进行性肺部疾病&#xff0c;其病因复杂&#xff0c;包括遗传、环境等多种因素。该病不仅影响患者的呼吸功能&#xff0c;还可能对神经系统造成损害。因此&#xff0c;预防神经性肺纤维化显得尤为重要。本文将详细介…

azure sql 网络安全组 网络安全sql注入

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 SQL注入 1、原理 针对注入的攻击行为可描述为通过用户可控参数中注入SQL语法&#xff0c;破坏原有SQL结构&#xff0c;达到编写程序意料之外结果的攻击行为。 其…

【Day50 LeetCode】图论问题 Ⅷ

一、图论问题 Ⅷ 1、dijkstra算法 堆优化 采用堆来优化&#xff0c;适合节点多的稀疏图。代码如下&#xff1a; # include<iostream> # include<vector> # include<list> # include<queue> # include<climits>using namespace std;class myco…

利用node.js搭配express框架写后端接口(一)

Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点&#xff0c;成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一&#xff0c;以其简洁的 API 和丰富的中间件生态系统&#xff0c;极大地简化了 Web 后端开发流程…