本文目录导读:

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键实现更灵活的停止)。
如果您需要更完整的功能(如添加鼠标高亮、区域选择录制、实时预览、将音频直接合成到视频中),可以在此基础上进一步扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播