我正在尝试制作一个计算机应用程序,该应用程序将查看Spotify和不和谐输出的音量,并进行相应的平衡,以便我可以听到朋友的声音,但是当他们不说话时,我的音乐会更大声。
这是用于Windows 10计算机,我使用pycaw来获取主卷以及修改主卷;但是,我找不到用于输出当前音量的选项。
from __future__ import print_function
from pycaw.pycaw import AudioUtilities, ISimpleAudioVolume, IAudioEndpointVolume, IAudioEndpointVolumeCallback
def main():
sessions = AudioUtilities.GetAllSessions()
for session in sessions:
volume = session._ctl.QueryInterface(ISimpleAudioVolume)
if session.Process and session.Process.name() == "Discord.exe":
print("volume.GetMasterVolume(): %s" % volume.GetMasterVolume())
if __name__ == "__main__":
main()
这样做,我可以获得不和谐的最大音量(例如1.0)。但是,我想获取当前正在输出的音频不和谐等级(例如0.3)。我需要更换
volume.GetMasterVolume()
要实现这一目标?谢谢。
答案 0 :(得分:1)
这不是一个完整的答案,但我认为它可以帮助某人。
您应该查看 Windows Core Audio API。此 API 的一部分是“音频会话”https://docs.microsoft.com/en-us/windows/win32/coreaudio/audio-sessions,它们是应用程序出现在音量混合器中时的音频会话,我认为这就是您所指的音量。
有一个名为 pyWinCoreAudio
的正在开发中的现有 Python 库,但它似乎不完整,目前不包括音频会话(或者说我无法接受)。但是,您可以查看开源 (GPL) 源代码,添加查询音频会话和设置它们的功能应该相对简单。
例如,对于已经在 pyWinCoreAudio
中工作的部件,您可以通过以下方式在现有设备上设置音量:
import pyWinCoreAudio as wca
wca.AudioDevices[3].render_endpoints[0].volume.channel_levels = (-10, -10)
在这种情况下,AudioDevices[3]
恰好是我的耳机,将音量设置为 (-10, -10)
会将其设置为低于最大值 10dB(在两个频道上都是 (0, 0)
。
要列出系统上的所有音频设备及其输出,您可以执行以下操作:
import pyWinCoreAudio as wca
for n, d in enumerate(wca.AudioDevices):
for rep in d.render_endpoints:
print(f'render endpoint {n}: {rep.name} is a {rep.form_factor}')
但这与实际设备有关,而不是与生成音频的应用程序(即音频会话)有关,库似乎尚未公开。
答案 1 :(得分:0)
我猜你需要的是 volume.GetMasterVolumeLevel()
(source)。
from __future__ import print_function
from pycaw.pycaw import AudioUtilities, ISimpleAudioVolume, IAudioEndpointVolume, IAudioEndpointVolumeCallback
from ctypes import POINTER, cast
from comtypes import CLSCTX_ALL
def main():
sessions = AudioUtilities.GetAllSessions()
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
for session in sessions:
if session.Process and session.Process.name() == "Discord.exe":
print("volume.GetMasterVolumeLevel(): %s" % volume.GetMasterVolumeLevel())
if __name__ == "__main__":
main()
更新:
这段代码实际做的是获取 Windows 的当前音量级别(而不是正在运行的应用程序),我认为这与您想要实现的内容相关。
当你尝试这个
print("volume.GetVolumeRange(): (%s, %s, %s)" % volume.GetVolumeRange()) # (-74.0, 0.0, 0.03125)
它将返回Windows的音量范围(在我的例子中是-74.0到0.0)从低到高,即-74.0表示计算机上的音量级别为0,而0.0表示计算机上的音量级别为100。< /p>
如果你想设置这个值,你可以简单地做:
volume.SetMasterVolumeLevel(-30.0, None)