Python监测Windows系统是否有音频播放
项目自动化中有一个涉及到播放音频的脚本case
要判断下是否真的播放成功了,系统声卡是否有声音出来,网上找了好久没找到啥解决方案,综合了树莓派对声音实时监控的 解决方案生成了下面的方法,记录下
import pyaudio
import numpy as np
def monitor_video():
"""
声音监测
:return:
"""
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=2,
rate=44100,
input=True,
frames_per_buffer=1024)
print("开始监测是否有声音播放")
for i in range(0, 10):
data = stream.read(1024)
audio_data = np.fromstring(data, dtype=np.short)
temp = np.max(audio_data)
print(temp)
time.sleep(1)
if i >= 4 and temp >= 200:
print("检测到信号")
print('当前阈值:', temp)
return True
print("监测10秒结束,没有监测到当前电脑设备有音频正在播放")
stream.stop_stream()
stream.close()
p.terminate()
return False
大致思路就是 通过 pyaudio 结合 numpy 进行一个录制的音频分贝判断监测
解决思路:录制一小段的声音后再去检测分贝,如果超过阈值(自己定的一个 有声跟没声的一个值,这里我定了一个200)就意味监听到有声音播放,否则就继续录制。
这里就是连续10秒去监测,去掉前5秒的分贝,一是因为为了让声音播放一段时间后再判断,二是因为项目那个音频播放有个渐进,所以等待下。
下面再记录下如何判断Windows系统当前是否静音,以及系统音量多少以及去设置音量的方法:
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
# 判断是否静音,mute为1代表是静音,为0代表不是静音
mute = volume.GetMute()
if mute == 1:
print('当前是静音状态')
else:
print('当前是非静音状态')
# 获取音量值,0.0代表最大,-65.25代表最小
vl = volume.GetMasterVolumeLevel()
print('当前音量值为%s' % vl)
# 获取音量范围,我的电脑经测试是(-65.25, 0.0, 0.03125),第一个应该代表最小值,第二个代表最大值,第三个不知道是干嘛的。也就是音量从大到小是0.0到-65.25这个范围
vr = volume.GetVolumeRange()
print('当前音量值为%s' % str(vr))
# 设置音量, 比如-13.6代表音量是40,0.0代表音量是100
volume.SetMasterVolumeLevel(-13.6, None)
print('已设置音量为40%')