我有什么办法可以查看应用程序正在输出多少容量?

时间:2019-06-08 22:09:52

标签: python

我正在尝试制作一个计算机应用程序,该应用程序将查看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()

要实现这一目标?谢谢。

2 个答案:

答案 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)