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 的线程库并行录制音频和屏幕,可以提高效率。
- 停止录制:可以在指定的时间后自动停止录制,或手动调用停止录制的函数。
使用此应用程序,用户可以轻松地录制音频和视频,创建教程或其他需要录制的内容。