本文目录导读:

import cv2
import numpy as np
import pyautogui
import pyaudio
import wave
import threading
import time
import os
from datetime import datetime
# 录制参数设置
SCREEN_SIZE = (1920, 1080) # 根据您的屏幕分辨率调整
FPS = 20.0
OUTPUT_DIR = "recordings"
AUDIO_FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = 1024
class ScreenRecorder:
def __init__(self):
self.recording = False
self.audio_frames = []
self.video_writer = None
self.audio_thread = None
self.video_thread = None
# 确保输出目录存在
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
def start_recording(self):
"""开始录制屏幕和音频"""
self.recording = True
self.audio_frames = []
# 生成输出文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
self.output_file = os.path.join(OUTPUT_DIR, f"recording_{timestamp}.avi")
# 初始化视频写入器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
self.video_writer = cv2.VideoWriter(
self.output_file,
fourcc,
FPS,
SCREEN_SIZE
)
# 启动录制线程
self.audio_thread = threading.Thread(target=self._record_audio)
self.video_thread = threading.Thread(target=self._record_video)
self.audio_thread.start()
self.video_thread.start()
print(f"开始录制... ({self.output_file})")
def stop_recording(self):
"""停止录制并保存文件"""
self.recording = False
# 等待线程结束
if self.video_thread and self.video_thread.is_alive():
self.video_thread.join()
if self.audio_thread and self.audio_thread.is_alive():
self.audio_thread.join()
# 释放视频写入器
if self.video_writer:
self.video_writer.release()
# 保存音频文件
self._save_audio()
print(f"录制完成!文件已保存: {self.output_file}")
def _record_video(self):
"""录制屏幕视频"""
while self.recording:
# 截取屏幕
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# 写入视频帧
self.video_writer.write(frame)
# 控制帧率
time.sleep(1.0 / FPS)
def _record_audio(self):
"""录制系统音频"""
p = pyaudio.PyAudio()
# 查找立体声混音设备(Windows)或默认输入设备
device_index = None
for i in range(p.get_device_count()):
dev_info = p.get_device_info_by_index(i)
if '立体声混音' in dev_info['name'] or 'Stereo Mix' in dev_info['name']:
device_index = i
break
if device_index is None:
# 如果没有找到立体声混音设备,使用默认输入设备
device_index = p.get_default_input_device_info()['index']
print(f"使用默认输入设备: {p.get_device_info_by_index(device_index)['name']}")
stream = p.open(
format=AUDIO_FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
input_device_index=device_index,
frames_per_buffer=CHUNK
)
while self.recording:
data = stream.read(CHUNK, exception_on_overflow=False)
self.audio_frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
def _save_audio(self):
"""保存音频到 WAV 文件"""
if not self.audio_frames:
return
audio_file = self.output_file.replace('.avi', '_audio.wav')
wf = wave.open(audio_file, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(pyaudio.PyAudio().get_sample_size(AUDIO_FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(self.audio_frames))
wf.close()
print(f"音频已保存: {audio_file}")
# 使用示例
if __name__ == "__main__":
recorder = ScreenRecorder()
print("简易录屏脚本")
print("按 Enter 开始录制...")
input()
recorder.start_recording()
print("正在录制中... 按 Enter 停止录制")
input()
recorder.stop_recording()
主要功能与使用方法
-
安装依赖库: 运行前请确保已安装所需库:
pip install opencv-python pyautogui numpy pyaudio
-
运行脚本: 执行后,按 Enter 键开始录制,再次按 Enter 键停止,录制的视频(AVI格式)和音频(WAV格式)会保存在
recordings文件夹中。 -
配置参数:
SCREEN_SIZE:根据您的显示器分辨率修改(如(1920, 1080))。FPS:帧率,0是较平衡的选择。- 音频参数(
RATE、CHANNELS)通常无需修改。
注意事项
- 音频录制:脚本会优先尝试使用“立体声混音”设备录制系统音频,如果未找到,将使用默认麦克风(可能无法捕获系统声音)。
- 性能:录屏对CPU有一定占用,如果感觉卡顿,可以降低
FPS或SCREEN_SIZE。 - 停止方式:脚本通过两次
input()实现开始/停止控制,您也可以修改为监听键盘热键(如esc键实现更灵活的停止)。
如果您需要更完整的功能(如添加鼠标高亮、区域选择录制、实时预览、将音频直接合成到视频中),可以在此基础上进一步扩展。