admin 管理员组文章数量: 1184232
import pyaudio
import numpy as np
import ctypes
import time
import threading
# 音频配置
FORMAT = pyaudio.paFloat32
CHANNELS =1
RATE =44100
CHUNK =1024# 指示灯控制阈值
THRESHOLD =0.001# 音量阈值,根据需要调整灵敏度classScrollLockController:def__init__(self):# 加载用户32.dll库来控制键盘指示灯
self.user32 = ctypes.WinDLL('user32', use_last_error=True)
self.last_state =False# 记录上一次的状态,避免频繁切换
self.running =True# 控制线程运行的标志defset_scrolllock(self, state):"""设置ScrollLock指示灯状态"""if state == self.last_state:return# 如果状态没变,不做任何操作
self.last_state = state
# 获取当前键盘状态
key_state = ctypes.create_string_buffer(256)
self.user32.GetKeyboardState(ctypes.byref(key_state))# 检查当前ScrollLock状态 - 使用0x91作为ScrollLock的键码
current_state =(ord(key_state[0x91])&1)!=0# 如果需要改变状态,则模拟按键if current_state != state:# 按下ScrollLock (0x91是ScrollLock的虚拟键码)
self.user32.keybd_event(0x91,0,0,0)# 释放ScrollLock
self.user32.keybd_event(0x91,0,0x0002,0)defaudio_monitor(self):"""监听音频并控制指示灯"""# 初始化音频输入
audio = pyaudio.PyAudio()# 打开音频流
stream = audio.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,input=True,
frames_per_buffer=CHUNK
)print("开始监听音频,按Ctrl+C退出...")try:while self.running:# 读取音频数据
data = stream.read(CHUNK)# 转换为numpy数组
audio_data = np.frombuffer(data, dtype=np.float32)# 计算音量(RMS值)
volume = np.sqrt(np.mean(np.square(audio_data)))# 根据音量设置ScrollLock状态if volume > THRESHOLD:
self.set_scrolllock(True)else:
self.set_scrolllock(False)# 短暂延迟,减少CPU占用
time.sleep(0.01)except KeyboardInterrupt:print("\n程序正在退出...")finally:# 清理资源
stream.stop_stream()
stream.close()
audio.terminate()# 确保退出时ScrollLock是开启状态
self.set_scrolllock(True)defstart(self):"""启动监控线程"""
self.thread = threading.Thread(target=self.audio_monitor)
self.thread.start()defstop(self):"""停止监控线程"""
self.running =False
self.thread.join()if __name__ =="__main__":try:print("注意:运行此程序需要安装pyaudio库")print("如果尚未安装,请先运行:pip install pyaudio numpy\n")
controller = ScrollLockController()
controller.start()# 保持主线程运行whileTrue:
time.sleep(1)except KeyboardInterrupt:
controller.stop()print("程序已退出")版权声明:本文标题:用python编写的一个随着播放器的音乐声音变化的键盘ScrollLock指示灯的程序 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1773849483a3566425.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论