【问题标题】:Python Change Master/Application VolumePython 更改主/应用程序卷
【发布时间】:2014-01-16 16:50:43
【问题描述】:

如何更改?

我正在寻找类似的东西:

SetMasterVolume(0.5)
SetAppVolume('FooBar',0.5)

我尝试使用 ctypes.windll.winmm,但找不到太多关于如何使用它的文档。

提前致谢。

【问题讨论】:

  • 对一个人也很抱歉,但是更改应用程序的音量取决于您使用的库,如果您使用的是 pygame,则为pygame.mixer.music.set_volume(value)

标签: python windows audio volume


【解决方案1】:

我希望 5 年后这对您来说不再是问题,但我只需要做同样的事情。可以使用PyCaw 库。

简单的概念证明,基于 PyCaw 的示例

from __future__ import print_function
from pycaw.pycaw import AudioUtilities, ISimpleAudioVolume


def main():
    sessions = AudioUtilities.GetAllSessions()
    for session in sessions:
        volume = session._ctl.QueryInterface(ISimpleAudioVolume)
        if session.Process and session.Process.name() == "vlc.exe":
            print("volume.GetMasterVolume(): %s" % volume.GetMasterVolume())
            volume.SetMasterVolume(0.6, None)


if __name__ == "__main__":
    main()

【讨论】:

【解决方案2】:

这是一种非常迂回的方法,但它有效。您可以使用pynput 模拟计算机主音量的按键。它有效,但它非常不准确。

from pynput.keyboard import Key,Controller
keyboard = Controller()
import time
while True:
    for i in range(10):
        keyboard.press(Key.media_volume_up)
        keyboard.release(Key.media_volume_up)
        time.sleep(0.1)
    for i in range(10):
        keyboard.press(Key.media_volume_down)
        keyboard.release(Key.media_volume_down)
        time.sleep(0.1)
    time.sleep(2) 

这是一个不错的方法。每次按键和释放大约等于 2 音量。希望这有点帮助!

【讨论】:

  • 顺便说一句,我知道这适用于我不了解 linux 或 mac 的 windows
【解决方案3】:

我知道这为时已晚,但如果有人仍在寻找无缝解决方案

Download this exe application from here

只需使用 python 调用此命令

./SoundVolumeView.exe /SetVolume "High Definition Audio Device\Device\Speakers" 50 

【讨论】:

  • 喜欢它。手动打开程序,右键单击所需设备,然后单击属性。 “命令行友好 ID”包含要作为参数提供的名称
  • 但它是预编译的。
【解决方案4】:

我从here 撕下它,并将其修改为仅使用函数。

import time
import ctypes

# Import the SendInput object
SendInput = ctypes.windll.user32.SendInput

# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)

class KeyBoardInput(ctypes.Structure):
    _fields_ = [
        ("wVk", ctypes.c_ushort),
        ("wScan", ctypes.c_ushort),
        ("dwFlags", ctypes.c_ulong),
        ("time", ctypes.c_ulong),
        ("dwExtraInfo", PUL)
    ]

class HardwareInput(ctypes.Structure):
    _fields_ = [
        ("uMsg", ctypes.c_ulong),
        ("wParamL", ctypes.c_short),
        ("wParamH", ctypes.c_ushort)
    ]

class MouseInput(ctypes.Structure):
    _fields_ = [
        ("dx", ctypes.c_long),
        ("dy", ctypes.c_long),
        ("mouseData", ctypes.c_ulong),
        ("dwFlags", ctypes.c_ulong),
        ("time",ctypes.c_ulong),
        ("dwExtraInfo", PUL)
    ]

class Input_I(ctypes.Union):
    _fields_ = [
        ("ki", KeyBoardInput),
        ("mi", MouseInput),
        ("hi", HardwareInput)
    ]

class Input(ctypes.Structure):
    _fields_ = [
        ("type", ctypes.c_ulong),
        ("ii", Input_I)
    ]

VK_VOLUME_MUTE = 0xAD
VK_VOLUME_DOWN = 0xAE
VK_VOLUME_UP = 0xAF

def key_down(keyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBoardInput(keyCode, 0x48, 0, 0, ctypes.pointer(extra))
    x = Input( ctypes.c_ulong(1), ii_ )
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


def key_up(keyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBoardInput(keyCode, 0x48, 0x0002, 0, ctypes.pointer(extra))
    x = Input(ctypes.c_ulong(1), ii_)
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


def key(key_code, length = 0):    
    key_down(key_code)
    time.sleep(length)
    key_up(key_code)


def volume_up():
    key(VK_VOLUME_UP)


def volume_down():
    key(VK_VOLUME_DOWN)

def set_volume(int):
    for _ in range(0, 50):
        volume_down()
    for _ in range(int / 2):
        volume_up()

【讨论】:

  • 这是 EventGhost 问题的可行解决方法,即安装 LAV 过滤器后卷在 Win10 中停止工作。
【解决方案5】:
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))
 
# Control volume
#volume.SetMasterVolumeLevel(-0.0, None) #max
#volume.SetMasterVolumeLevel(-5.0, None) #72%
volume.SetMasterVolumeLevel(-10.0, None) #51%

【讨论】:

    【解决方案6】:

    因此,我没有编辑我的旧答案,而是添加了一个新帖子,以允许使用 self 的其他人使用我的旧代码以及不使用我的人使用我的新代码。

    def get_master_volume():
        proc = subprocess.Popen('/usr/bin/amixer sget Master', shell=True, stdout=subprocess.PIPE)
        amixer_stdout = proc.communicate()[0].split('\n')[4]
        proc.wait()
    
        find_start = amixer_stdout.find('[') + 1
        find_end = amixer_stdout.find('%]', find_start)
    
        return float(amixer_stdout[find_start:find_end])
    
    def set_master_volume(volume):
        val = float(int(volume))
    
        proc = subprocess.Popen('/usr/bin/amixer sset Master ' + str(val) + '%', shell=True, stdout=subprocess.PIPE)
        proc.wait()
    

    【讨论】:

    • 再次感谢您的回复。我仍然收到“系统找不到指定的路径。”
    • @f.rodrigues,这在 Windows 上不起作用。路径 /usr 仅在基于 unix 的系统上
    • 问题是关于windows的。您的答案仅适用于基于 unix 的系统,它不回答问题。
    【解决方案7】:

    第一个导入子流程 import subprocess

    然后获取主卷

    def get_master_volume(self):
        proc = subprocess.Popen('/usr/bin/amixer sget Master', shell=True, stdout=subprocess.PIPE)
        amixer_stdout = proc.communicate()[0].split('\n')[4]
        proc.wait()
    
        find_start = amixer_stdout.find('[') + 1
        find_end = amixer_stdout.find('%]', find_start)
    
        return float(amixer_stdout[find_start:find_end])
    

    并设置主音量

    def set_master_volume(self, widget):
        val = self.volume
        val = float(int(val))
        proc = subprocess.Popen('/usr/bin/amixer sset Master ' + str(val) + '%', shell=True, stdout=subprocess.PIPE)
        proc.wait()
    

    【讨论】:

    • 感谢您的回复。如果我尝试 'set_master_volume(0.5,'foobar2000')' 我得到: AttributeError: 'float' object has no attribute 'volume' 如果我有机会 val 为 0.5 我得到:'系统找不到指定的路径。我想我需要获取应用程序正确的地址,但我不知道该怎么做。
    • 我认为没有理由将音量设置为 0.5%,因为您可能会看到它将主音量设置为一个百分比,所以说您想将音量更改为 50% self.volume需要等于 50.0 所以只需调用 val = float(int(val)) 它会将 50 设置为整数,如果它类似于 50.1,然后将其更改为 50.0 的浮点数
    • 这是一个 Linux 答案。它如何应用于 MS-Windows?问题指定了 Windows。
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多