检查 windows 上是否有任何设备正在播放声音 python
check if any devices on windows are playing sound python
我正在尝试检测 windows 上的系统声音,我想我可以使用 pyaudio 模块,因为 winrt 对我不起作用。
我有这个列出所有设备的代码,我知道我可以用 pyaudio
打开流
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
dev = p.get_device_info_by_index(i)
print(dev)
但我如何判断这些设备中的任何一个当前是否正在输出声音?我是否为每个人打开一个流并取字节的均方根?如果这是一个 XY 问题,我最好使用另一个模块,请告诉我
我之前使用名为 PyCaw 的库(Python Windows 的核心音频)
第一个pip install pycaw
出于某种原因,此安装仅在 运行 作为管理员时有效,但这可能是我的机器特有的问题
下面列出当前正在输出音频的进程。
from pycaw.pycaw import AudioUtilities
sessions = AudioUtilities.GetAllSessions()
for session in sessions:
print(session.Process)
出于某种原因,它似乎总是在末尾有一个 None 引用,但您应该能够很容易地处理它
在 python 中,我没有找到任何非常有效的模块来检索 pc 的内部音频,而是找到了一种使用 Stereo Mixer[将输出设备模拟为输入的方法] =26=] 在 windows 平台上。
请参考 this link 在您的 windows 环境中启用立体声混音器。
之后使用此代码找到立体声混音器所在的索引:
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
print("\n\n Index " + str(i) + " :\n")
dev = p.get_device_info_by_index(i)
print(dev.get('name'))
print("------------------------------------------------------------")
此代码将列出所有音频设备及其索引。记下电脑中Stereo Mixer的索引号。
检测声音的主要代码来了,将设备变量的值替换为Stereo Mixer的索引。对我来说是 2.
import pyaudio
import audioop
p = pyaudio.PyAudio()
CHUNK = 1024
FORMAT = pyaudio.paInt16
RATE = 44100
silent_threshold = 1
device = 2
stream = p.open(format=FORMAT, channels = p.get_device_info_by_index(device).get('maxInputChannels') , rate=RATE, input = True , frames_per_buffer=CHUNK , input_device_index = device)
while True:
data=stream.read(CHUNK)
threshold = audioop.max(data , 2)
print(threshold)
if threshold > silent_threshold :
print("Sound found at index " + str(device))
else :
print("Sound not found at index " + str(device))
p.terminate()
注意 silent_threshold 的用法,你增加它的值越多,它变得越不活跃。例如,如果你想检测绝对静音使用 1 或检测安静使用 20 ,这取决于你的电脑上的声音播放。
我正在尝试检测 windows 上的系统声音,我想我可以使用 pyaudio 模块,因为 winrt 对我不起作用。 我有这个列出所有设备的代码,我知道我可以用 pyaudio
打开流import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
dev = p.get_device_info_by_index(i)
print(dev)
但我如何判断这些设备中的任何一个当前是否正在输出声音?我是否为每个人打开一个流并取字节的均方根?如果这是一个 XY 问题,我最好使用另一个模块,请告诉我
我之前使用名为 PyCaw 的库(Python Windows 的核心音频)
第一个pip install pycaw
出于某种原因,此安装仅在 运行 作为管理员时有效,但这可能是我的机器特有的问题
下面列出当前正在输出音频的进程。
from pycaw.pycaw import AudioUtilities
sessions = AudioUtilities.GetAllSessions()
for session in sessions:
print(session.Process)
出于某种原因,它似乎总是在末尾有一个 None 引用,但您应该能够很容易地处理它
在 python 中,我没有找到任何非常有效的模块来检索 pc 的内部音频,而是找到了一种使用 Stereo Mixer[将输出设备模拟为输入的方法] =26=] 在 windows 平台上。
请参考 this link 在您的 windows 环境中启用立体声混音器。
之后使用此代码找到立体声混音器所在的索引:
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
print("\n\n Index " + str(i) + " :\n")
dev = p.get_device_info_by_index(i)
print(dev.get('name'))
print("------------------------------------------------------------")
此代码将列出所有音频设备及其索引。记下电脑中Stereo Mixer的索引号。
检测声音的主要代码来了,将设备变量的值替换为Stereo Mixer的索引。对我来说是 2.
import pyaudio
import audioop
p = pyaudio.PyAudio()
CHUNK = 1024
FORMAT = pyaudio.paInt16
RATE = 44100
silent_threshold = 1
device = 2
stream = p.open(format=FORMAT, channels = p.get_device_info_by_index(device).get('maxInputChannels') , rate=RATE, input = True , frames_per_buffer=CHUNK , input_device_index = device)
while True:
data=stream.read(CHUNK)
threshold = audioop.max(data , 2)
print(threshold)
if threshold > silent_threshold :
print("Sound found at index " + str(device))
else :
print("Sound not found at index " + str(device))
p.terminate()
注意 silent_threshold 的用法,你增加它的值越多,它变得越不活跃。例如,如果你想检测绝对静音使用 1 或检测安静使用 20 ,这取决于你的电脑上的声音播放。