python实现屏幕录制,录音录制工具
python实现屏幕录制,录音录制工具
一,介绍
Python 实现的屏幕录制和录音录制工具是一个便捷的应用程序,旨在帮助用户同时捕捉计算机屏幕上的活动以及与之相关的音频输出。这个工具尤其针对教育工作者、内容创作者、技术支持人员以及任何需要展示互动过程或共享实时演示的用户。

二,主要功能
- 屏幕录制:捕捉整个屏幕或指定区域的视频,能够以 AVI 或 MP4 等格式保存。
- 音频录制:能够选择录制系统音(计算机播放的音频)或外部环境声音(通过麦克风录制的声音),并将其保存为 WAV 格式文件。
- 多线程执行:实现屏幕录制与音频录制并行进行,确保同时捕捉视觉和听觉信息。
- 用户友好的图形界面:使用 Tkinter 库创建简单直观的用户界面,便于用户操作和设置录制参数。
1.作用
- 教育与培训:教师可以录制在线课程、课程演示或教学内容,方便学生回看和复习。
- 演示与演讲:讲师或营销人员可以创建产品演示和视频演讲,便于直观展示功能和效果。
- 技术支持与远程协助:技术支持人员可以记录故障排除过程,帮助用户解决问题,同时提供反馈和解决方案。
- 内容创作:内容创造者(如YouTuber和博主)可以制作视频教程、评论和游戏实况,增强与观众的互动。
2.目的
这个工具的主要目的是为用户提供一种高效、简便的方式来创建与记录屏幕活动和音频内容,减少传统录制过程中的复杂性,使制作视频内容变得更加可及与灵活。此外,此工具帮助用户以更直观、生动的方式记录和分享他们的工作或创意,有助于知识传播和信息共享。
通过集成屏幕录制与音频录制的功能,用户能够更全面地展现信息,提高内容的质量和吸引力,符合当今数字化学习与远程工作的需求。
三,用python实现录音功能
import tkinter as tk
# 导入 tkinter 库,用于创建图形用户界面 (GUI)。 from tkinter import filedialog, messagebox
# 从 tkinter 中导入文件选择对话框和消息框。 import pyaudio
# 导入 pyaudio 库,用于音频录制。 import wave
# 导入 wave 库,用于保存音频为 WAV 格式。 import sounddevice as sd
# 导入 sounddevice 库,用于录制系统声音。 import numpy as np
# 导入 numpy 库,通常用于数值计算,但在这个例子中未明显使用。 import soundfile as sf
# 导入 soundfile 库,用于保存音频文件(如 WAV)。 class AudioRecorderApp: # 定义一个类 AudioRecorderApp,表示音频录制工具。 def __init__(self, root): # 构造函数,初始化应用程序界面。 self.root = root self.root.title("音频录制工具") # 设置窗口标题。 self.record_option = tk.StringVar(value="external") # 创建一个字符串变量,用于存储录音方式(外部音频或系统音频)。 self.duration = tk.IntVar(value=10) # 创建一个整型变量用于存储录音时长,默认为10秒。 self.output_filename = None # 初始化保存文件名为 None,稍后选择保存位置时会更新。 # 录音方式选择 tk.Label(root, text="选择录音方式:").pack(pady=10) # 创建标签,提示用户选择录音方式。 tk.Radiobutton(root, text="外部环境声音", variable=self.record_option, value="external").pack(anchor=tk.W) # 创建单选按钮,选择外部环境声音录制方式。 tk.Radiobutton(root, text="系统声音", variable=self.record_option, value="system").pack(anchor=tk.W) # 创建单选按钮,选择系统声音录制方式。 # 录制时长输入 tk.Label(root, text="录音时长(秒):").pack(pady=10) # 创建标签,提示用户输入录音时长。 tk.Entry(root, textvariable=self.duration).pack() # 创建文本输入框,用户输入录音时长。 # 选择保存位置按钮 tk.Button(root, text="选择保存位置", command=self.select_output_file).pack(pady=10) # 创建按钮,点击后选择保存文件的位置。 # 开始录音按钮 tk.Button(root, text="开始录音", command=self.start_recording).pack(pady=20) # 创建按钮,点击后开始录音。 def select_output_file(self): # 定义选择保存文件名的方法。 self.output_filename = filedialog.asksaveasfilename(defaultextension=".wav", filetypes=[("WAV files", "*.wav"), ("All files", "*.*")]) # 弹出文件对话框,让用户选择保存的文件名和位置。 if self.output_filename: messagebox.showinfo("选择成功", f"保存位置:{self.output_filename}") # 如果用户选择了文件名,弹出提示框确认选择。 def start_recording(self): # 定义开始录音的方法。 if not self.output_filename: messagebox.showwarning("警告", "请先选择保存位置!") # 如果未选择保存位置,弹出警告提示。 return if self.record_option.get() == "external": self.record_external_sound() # 如果选择外部音频,调用外部音频录制函数。 else: self.record_system_sound() # 否则调用系统声音录制函数。 def record_external_sound(self): # 定义外部声音录制的方法。 chunk = 4096 # 每次读取的音频数据块大小。 format = pyaudio.paInt16 # 设置音频格式为 16 位深度。 channels = 2 # 设置为立体声(两个通道)。 rate = 96000 # 设置采样率为 96 kHz。 duration = self.duration.get() # 获取用户输入的录音时长。 p = pyaudio.PyAudio() # 初始化 PyAudio。 stream = p.open(format=format, channels=channels, rate=rate, input=True, frames_per_buffer=chunk) # 打开音频流进行录制。 frames = [] # 创建一个空列表,用于存储录音数据。 messagebox.showinfo("信息", "开始录制外部声音...") # 弹出提示框,通知用户开始录音。 for _ in range(0, int(rate / chunk * duration)): data = stream.read(chunk) # 循环读取音频数据块。 frames.append(data) # 将读取的数据块添加到 frames 列表中。 stream.stop_stream() # 停止音频流。 stream.close() # 关闭音频流。 p.terminate() # 终止 PyAudio 会话,释放资源。 with wave.open(self.output_filename, 'wb') as wf: # 以写入模式打开 WAV 文件。 wf.setnchannels(channels) # 设置音频通道数。 wf.setsampwidth(p.get_sample_size(format)) # 设置样本宽度。 wf.setframerate(rate) # 设置采样率。 wf.writeframes(b''.join(frames)) # 将所有录制的帧写入文件。 messagebox.showinfo("信息", "外部声音录制完成。") # 弹出提示框,通知用户外部声音录制完成。 def record_system_sound(self): # 定义录制系统声音的方法。 fs = 192000 # 设置采样率为 192 kHz。 duration = self.duration.get() # 获取用户输入的录音时长。 messagebox.showinfo("信息", "开始录制系统声音...") # 弹出提示框,通知用户开始录制系统声音。 audio = sd.rec(int(duration * fs), samplerate=fs, channels=2, dtype='float32', blocking=True) # 使用 sounddevice 库录制音频,blocking=True 参数确保录制完成后再继续执行后面的代码。 sf.write(self.output_filename, audio, fs) # 使用 soundfile 库将录制的音频保存为 WAV 文件。 messagebox.showinfo("信息", "系统声音录制完成。") # 弹出提示框,通知用户系统声音录制完成。 if __name__ == "__main__": root = tk.Tk() # 创建主窗口。 app = AudioRecorderApp(root) # 初始化音频录制工具类。 root.mainloop() # 启动 tkinter 事件循环,运行应用程序。
运行结果:
代码功能概述
这段代码实现了一个简单的音频录制工具,用户可以选择录制外部环境声音或系统声音。它具有以下功能:
-
界面创建:使用 tkinter 创建图形用户界面,包括选择录音方式(外部音频或系统音频)、输入录音时长、选择保存文件位置和开始录音的按钮。
-
选择文件保存位置:用户可以通过文件对话框选择录音文件的存储路径及文件名。
-
录音:
- 外部声音录制:使用 PyAudio 库录制外部环境的声音,并将录制的数据保存为 WAV 文件。
- 系统声音录制:使用 sounddevice 库录制系统声音并保存为 WAV 文件。
-
反馈提示:在录音开始和结束时,程序会通过消息框向用户提供相关信息和提示。
注意事项
- 确保已安装所需的库:
tkinter、pyaudio、wave、sounddevice、numpy、soundfile,可以通过pip install命令安装这些库。 - 该代码适用于 Windows 和部分 Linux 系统,但在 macOS 上可能需要额外配置,因为音频流的访问权限可能会有所不同。
- 录音时,确保已选择正确的录音设备以获得更好的音质。
四,用python实现录屏录音功能
import tkinter as tk
# 导入 tkinter 库,创建图形用户界面(GUI)。 from tkinter import filedialog, messagebox
# 从 tkinter 导入文件对话框(filedialog)和消息框(messagebox)模块。这用于选择文件和显示异步消息。 import pyaudio
# 导入 PyAudio 库,用于音频输入/输出。 import wave
# 导入 Wave 库,用于处理 WAV 音频文件。 import sounddevice as sd
# 导入 sounddevice 库,用于进行系统声音的录制。 import numpy as np
# 导入 numpy 库,为数据处理提供支持。 import cv2
# 导入 OpenCV 库,用于图像处理和视频录制。 import pyautogui
# 导入 pyautogui 库,用于截屏。 import threading
# 导入 threading 库,用于创建多线程。 class AudioRecorderApp: # 定义一个类 AudioRecorderApp,表示音频录制工具应用。 def __init__(self, root): # 构造函数,初始化应用程序界面。 self.root = root self.root.title("音频录制工具") # 设置窗口标题。 self.record_option = tk.StringVar(value="external") # 创建一个字符串变量,存储录音方式,默认为“外部声音”。 self.duration = tk.IntVar(value=10) # 创建一个整型变量,存储录音时长,默认为10秒。 self.output_filename = None # 初始化输出文件名为 None,稍后选择保存路径时会更新。 self.is_recording = False # 初始化录音状态为 False。 # 录音方式选择 tk.Label(root, text="选择录音方式:").pack(pady=10) # 创建标签提示用户选择录音方式。 tk.Radiobutton(root, text="外部环境声音", variable=self.record_option, value="external").pack(anchor=tk.W) # 创建单选按钮用于选择“外部环境声音”录制方式。 tk.Radiobutton(root, text="系统声音", variable=self.record_option, value="system").pack(anchor=tk.W) # 创建单选按钮用于选择“系统声音”录制方式。 # 选择保存位置按钮 tk.Button(root, text="选择保存位置", command=self.select_output_file).pack(pady=10) # 创建按钮,点击后选择保存文件的路径。 tk.Label(root, text="录音时长(秒):").pack(pady=10) # 创建标签,指导用户输入录音时长。 tk.Entry(root, textvariable=self.duration).pack() # 创建文本框,用户输入录音时长。 # 开始录音按钮 tk.Button(root, text="开始录音", command=self.start_recording).pack(pady=20) # 创建按钮,点击后开始录音。 def select_output_file(self): # 定义选择保存文件名的方法。 self.output_filename = filedialog.asksaveasfilename(defaultextension=".wav", filetypes=[("WAV files", "*.wav"), ("所有文件", "*.*")]) # 弹出文件对话框,让用户选择保存的文件名和位置。 if self.output_filename: messagebox.showinfo("选择成功", f"保存位置:{self.output_filename}") # 如果用户选择了文件名,弹出提示框确认选择。 def start_recording(self): # 定义开始录音的方法。 if not self.output_filename: messagebox.showwarning("警告", "请先选择保存位置!") # 如果未选择保存位置,弹出警告提示。 return self.is_recording = True duration_sec = self.duration.get() # 获取用户输入的录音时长。 # 启动音频录制线程 audio_thread = threading.Thread(target=self.record_audio) audio_thread.start() # 创建一个新线程,运行录音函数。 # 启动屏幕录制线程 screen_thread = threading.Thread(target=self.record_screen) screen_thread.start() # 创建另一个线程,用于录制屏幕。 # 设置录制的持续时间 threading.Timer(duration_sec, self.stop_recording).start() # 设置计时器,到达时间后停止录def record_audio(self): # 定义录制音频的方法。 if self.record_option.get() == "external": self.record_external_sound() # 如果选项为“external”,则调用录制外部声音的方法。 elif self.record_option.get() == "system": self.record_system_sound() # 如果选项为“system”,则调用录制系统声音的方法。 def record_external_sound(self): # 定义录制外部声音的方法。 chunk = 4096 # 设置每次读取的音频块大小。 format = pyaudio.paInt16 # 设置音频格式为16位整型。 channels = 2 # 设置音频通道数为2(立体声)。 rate = 44100 # 设置采样率为44100Hz。 duration = self.duration.get() # 获取录音持续时间。 p = pyaudio.PyAudio() # 创建 PyAudio 实例。 stream = p.open(format=format, channels=channels, rate=rate, input=True, frames_per_buffer=chunk) # 打开音频流以进行录音。 frames = [] # 用于存储录制的音频帧。 messagebox.showinfo("信息", "开始录制外部声音...") # 弹出提示框,通知用户开始录制。 for _ in range(0, int(rate / chunk * duration)): # 根据设置的采样率和时长计算需循环的次数。 data = stream.read(chunk) # 从音频流中读取音频数据。 frames.append(data) # 将读取的数据添加到帧列表中。 stream.stop_stream() # 停止音频流。 stream.close() # 关闭音频流。 p.terminate() # 终止 PyAudio 实例。 with wave.open(self.output_filename, 'wb') as wf: # 使用 wave 模块以写入模式打开 WAV 文件。 wf.setnchannels(channels) # 设置声道数。 wf.setsampwidth(p.get_sample_size(format)) # 设置采样宽度。 wf.setframerate(rate) # 设置采样率。 wf.writeframes(b''.join(frames)) # 写入帧数据到文件。 messagebox.showinfo("信息", "外部声音录制完成。") # 弹出提示框,表示录制完成。 def record_system_sound(self): # 定义录制系统声音的方法。 fs = 192000 # 设置采样率为192000Hz。 duration = self.duration.get() # 获取录音持续时间。 messagebox.showinfo("信息", "开始录制系统声音...") # 弹出提示框,通知用户开始录制。 audio = sd.rec(int(duration * fs), samplerate=fs, channels=2, dtype='float32', blocking=True) # 使用 sounddevice 库录制系统声音,设置时长、采样率、声道数和数据类型。 sf.write(self.output_filename, audio, fs) # 将录制的数据写入指定文件。 messagebox.showinfo("信息", "系统声音录制完成。") # 弹出提示框,表示录制完成。 def record_screen(self): # 定义录制屏幕的方法。 output_file = self.output_filename.replace('.wav', '.avi') # 保存为AVI格式 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 设置视频编码方式为 XVID。 fps = 20.0 # 设置帧率为20帧每秒。 screen_size = (1920, 1080) # 根据您的屏幕分辨率调整 # 指定屏幕尺寸。 out = cv2.VideoWriter(output_file, fourcc, fps, screen_size) # 创建 VideoWriter 对象,负责写入视频文件。 messagebox.showinfo("信息", "开始录制屏幕...") # 弹出提示框,通知用户开始录制。 duration_sec = self.duration.get() # 获取录制的持续时间。 for _ in range(int(duration_sec * fps)): # 将fps转换为整数 img = pyautogui.screenshot() # 截取屏幕 frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 转换为OpenCV格式 out.write(frame) # 写入视频 cv2.waitKey(int(1000 / fps)) # 控制帧率 out.release() # 释放视频文件 messagebox.showinfo("信息", "屏幕录制完成。") # 弹出提示框,表示屏幕录制完成。 def stop_recording(self): # 定义停止录制的方法。 self.is_recording = False # 更新录音状态为 False。 messagebox.showinfo("信息", "录制已停止。") # 弹出提示框,通知用户录制已停止。 if __name__ == "__main__": root = tk.Tk() # 创建 Tkinter 窗口的根对象。 app = AudioRecorderApp(root) # 创建 AudioRecorderApp 的实例,传入根对象。 root.mainloop() # 启动 Tkinter 主事件循环,等待用户操作。
运行结果:

功能总结
以上代码是一个音频和屏幕录制工具的实现,主要功能包括:
- 选择录音方式:用户可以选择录制“外部环境声音”或“系统声音”。
- 选择保存位置:用户可以选择保存录制音频和视频的文件位置。
- 设置录音时长:用户可以输入录制的时长(以秒为单位)。
- 启动录制:
- 启动录制外部声音或系统声音。
- 启动屏幕录制,录制屏幕内容并将其保存为 AVI 格式视频。
- 多线程支持:使用 Python 的线程库并行录制音频和屏幕,可以提高效率。
- 停止录制:可以在指定的时间后自动停止录制,或手动调用停止录制的函数。
使用此应用程序,用户可以轻松地录制音频和视频,创建教程或其他需要录制的内容。
相关文章:
python实现屏幕录制,录音录制工具
python实现屏幕录制,录音录制工具 一,介绍 Python 实现的屏幕录制和录音录制工具是一个便捷的应用程序,旨在帮助用户同时捕捉计算机屏幕上的活动以及与之相关的音频输出。这个工具尤其针对教育工作者、内容创作者、技术支持人员以及任何需要…...
elementui 的 table 组件回显已选数据时候使用toggleRowSelection 方法的坑点
elementui 的 table 组件回显问题 "vue": "^2.7.16", "element-ui": "^2.15.14", 问题描述: 场景:首先我们是通过接口获取到数据之后 然后将返回的数据回显到表格上面 问题:直接将后端返回的数据…...
MATLAB基础应用精讲-【数模应用】负二项回归(附R语言和python代码实现)
目录 前言 几个高频面试题目 负二项回归、Probit回归如何选择 负二项回归 Probit回归 知识储备 逻辑回归 算法原理 多阈值负二项回归模型 模型及估计方法 负二项回归模型 多阈值负二项回归模型 分割阶段 精确估计阈值阶段 负二项回归的操作步骤 负二项回归…...
20240803 芯动科技 笔试
文章目录 1、单选题1.11.21.31.42、填空题2.12.23、问答题3.13.23.34、编程题4.14.24.3岗位:嵌入式软件工程师(25届校招)(J12042) 题型:4 道单选题,2 道填空题, 3 道简答题,3 道编程题 1、单选题 1.1 已知 5 个元素的出栈序列是 1,2,3,4,5,6 则对应的入栈顺序可能是 …...
如何将 ECharts 图表插入 HTML Canvas
在 Web 开发中,数据可视化是一个常见且重要的需求。ECharts 是一个强大的图表库,而 HTML5 Canvas 则提供了灵活的绘图能力。今天,我们将探讨如何将这两者结合起来,实现将 ECharts 生成的图表插入到 HTML Canvas 中的特定位置。 为…...
突破干扰,无人机自动驾驶技术详解
突破干扰的无人机自动驾驶技术,是一个结合了多学科领域的复杂系统,旨在确保无人机在复杂电磁环境、人为干扰等条件下仍能自主、安全地完成飞行任务。以下是对该技术的详细解析: 一、技术概述 无人机自动驾驶技术通过集成传感器技术、人工智…...
Xamarin学习计划
一、Xamarin 的产生历程 Xamarin 由 Nat Friedman 和 Miguel de Icaza 创立。它的出现主要是为了让开发者能够使用 C#语言来构建跨平台的移动应用程序。 Xamarin 提供了一种统一的开发方式,允许开发者使用熟悉的 C#语言和.NET 框架来开发同时适用于多个平台的应…...
exchange online邮件系统EAM双因素认证技术方案
exchange online邮件系统是指微软推出的电子邮件系统云服务,通常作为office 365和microsoft 365的一个子项目来提供服务。这样用户就不需要自己部署exchange邮件服务器,只需要订阅微软的云服务,然后就可以直接使用微软提供的exchange邮件服务…...
【数据结构与算法】栈和队列
文章目录 一.栈1.1定义 顺序栈和链式栈1.2基本操作1.2.1表示1.2.2初始化1.2.3清空1.2.4销毁1.2.5入栈1.2.6出栈1.2.7取栈顶 1.3共享栈1.3.1定义1.3.2进栈出栈 二.队列2.1定义 顺序队列和链式队列循环队列2.2基本操作2.2.1初始化2.2.2判空2.2.3求队列长度2.2.4取队头元素2.2.5销…...
基于php的图书管理系统
摘 要 随着互联网的发展,许多人都热衷于在线购物,无需离开家就可以获得所需的产品,通过简单的操作,就能够获得快速、准确的配送。 科技已然渗透到进社会的方方面面,让我们的学习、交流、工作变得无比轻松自如。由于…...
k8s Node节点维护
Kubernetes (K8s) 中对 Node 节点的维护是保证集群健康和性能的重要部分。Node 节点通常是 Kubernetes 工作负载的运行环境,负责运行 Pods。当需要对节点进行维护(如升级、修复问题、调整配置等)时,可能需要将该节点标记为不可用并…...
【航天宏图旗下的PIE engine】
航天宏图旗下的PIE engine是一个集实时分布式计算、交互式分析和数据可视化为一体的在线遥感云计算开放平台,以下是对其的详细介绍: 一、平台背景与定位 PIE-Engine地球科学引擎是航天宏图自主研发的一套基于容器云技术构建的面向地球科学领域的专业P…...
Python酷库之旅-第三方库Pandas(157)
目录 一、用法精讲 716、pandas.Timedelta.view方法 716-1、语法 716-2、参数 716-3、功能 716-4、返回值 716-5、说明 716-6、用法 716-6-1、数据准备 716-6-2、代码示例 716-6-3、结果输出 717、pandas.Timedelta.as_unit方法 717-1、语法 717-2、参数 717-3、…...
【原创】java+springboot+mysql校园表白墙网站设计与实现
个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…...
CSS学习(Grid布局和flex布局比较)
grid网格布局真香,比flex方便太多了,grid-template-columns用法 文章目录 flex布局的时候网格grid布局的时候可以修改某一列的像素可以修改某一列的宽度占比自适应屏幕分列让第一个元素长宽都占2个 flex布局的时候 最后一行不够4个的时候 最下面一行无法…...
RTThread-Nano学习二-RT-Thread启动流程
一、简介 上一章,我们已经了解了如何通过MDK来移植RTT,不熟悉的可以看如下链接:RTThread-Nano学习一-基于MDK移植-CSDN博客本章我们就来继续了解一下,RTT的启动流程。 二、启动流程 官方给了一幅非常清晰的启动流程图&am…...
排查sshfs挂载失败的问题
#排查sshfs挂载失败的问题 写代码在Linux上运行,但是熟悉的IDE(比如VS code)在自己的电脑上,可以使用sshfs把linux上的目录挂载到本地,再用VScode打开即可,可以使用下面的命令: sshfs -odebug…...
【002】基于Spring Boot+Unipp的古诗词学习小程序【原创】
一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框架Vue.js;UI库:ElementUI; 开发工具&…...
PageHelper循环依赖问题
1. 问题 2. 原因 项目中SpringBoot的版本为2.7.18。 SpringBoot2.6.x后不推荐使用循环依赖,也就是说从2.6.x版本开始,如果项目里还存在循环依赖,SpringBoot将拒绝启动! 3. 解决 去pageHelper github看,才看到新版本…...
k8s部署Kafka集群超详细讲解
准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka:3.7.1版本,apche版本 Zookeeper:3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
