Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python更改主机/应用程序卷_Python_Windows_Audio_Volume - Fatal编程技术网

Python更改主机/应用程序卷

Python更改主机/应用程序卷,python,windows,audio,volume,Python,Windows,Audio,Volume,我如何改变它 我要找的东西是: SetMasterVolume(0.5) SetAppVolume('FooBar',0.5) 我试过使用ctypes.windell.winmm,但找不到多少关于如何使用它的文档 提前感谢。第一个导入子流程 导入子流程 然后获取主卷 def get_master_volume(self): proc = subprocess.Popen('/usr/bin/amixer sget Master', shell=True, stdout=subproce

我如何改变它

我要找的东西是:

SetMasterVolume(0.5)
SetAppVolume('FooBar',0.5)
我试过使用ctypes.windell.winmm,但找不到多少关于如何使用它的文档

提前感谢。

第一个导入子流程
导入子流程

然后获取主卷

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()
和设置主音量

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()

因此,我没有编辑我的旧答案,而是添加了一篇新帖子,允许其他使用self的人使用我的旧代码,而允许任何不使用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()

我希望5年后这对你来说不再是个问题,但我不得不做同样的事情。使用图书馆是可能的

基于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()
我将其从中删除并修改为仅使用函数

导入时间
导入ctypes
#导入SendInput对象
SendInput=ctypes.windell.user32.SendInput
#C结构重新定义
PUL=ctypes.POINTER(ctypes.c_ulong)
类键盘输入(ctypes.Structure):
_字段=[
(“wVk”,ctypes.c_ushort),
(“wScan”,ctypes.c_ushort),
(“dwFlags”,ctypes.c_ulong),
(“时间”,ctypes.c_ulong),
(“dwExtraInfo”,PUL)
]
类硬件输入(ctypes.Structure):
_字段=[
(“uMsg”,ctypes.c_ulong),
(“wParamL”,ctypes.c_简称),
(“wParamH”,ctypes.c_ushort)
]
类鼠标输入(ctypes.Structure):
_字段=[
(“dx”,ctypes.c_long),
(“dy”,ctypes.c_long),
(“mouseData”,ctypes.c_ulong),
(“dwFlags”,ctypes.c_ulong),
(“时间”,ctypes.c_ulong),
(“dwExtraInfo”,PUL)
]
类输入(ctypes.Union):
_字段=[
(“ki”,键盘输入),
(“米”,鼠标输入),
(“嗨”,硬件输入)
]
类输入(ctypes.Structure):
_字段=[
(“类型”,ctypes.c_ulong),
(“ii”,输入I)
]
VK_音量_静音=0xAD
VK_音量下降=0xAE
VK\u音量向上=0xAF
def钥匙按下(钥匙代码):
额外=ctypes.c_ulong(0)
ii=输入I()
ii_uki=键盘输入(键码,0x48,0,0,ctypes.指针(额外))
x=输入(ctypes.c_ulong(1)和ii_uu)
SendInput(1,ctypes.pointer(x),ctypes.sizeof(x))
def钥匙向上(钥匙代码):
额外=ctypes.c_ulong(0)
ii=输入I()
ii_uki=键盘输入(键码,0x48,0x0002,0,ctypes.指针(额外))
x=输入(ctypes.c_ulong(1)和ii_uu)
SendInput(1,ctypes.pointer(x),ctypes.sizeof(x))
def键(键代码,长度=0):
按键向下(按键代码)
睡眠时间(长度)
钥匙向上(钥匙代码)
def音量增大()
按键(VK_音量向上)
def音量下降()
按键(VK_音量下降)
def设置_音量(整数):
对于范围(0,50)内的uu:
音量下降
对于范围内的uu(int/2):
音量增大

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

只需使用python调用这个命令

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

这是一种非常迂回的方法,但它可以工作。您可以使用模拟计算机主卷的按键。它是有效的,但它是相当不精确的

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个音量。希望这有点帮助

谢谢你的回复。如果我尝试“set_master_volume(0.5,'foobar2000'),我会得到:AttributeError:“float”对象没有属性“volume”,如果我偶然将val设置为0.5,我会得到:“系统找不到指定的路径”。我想我需要获得正确的应用程序地址,但是我不知道怎么做。我看不出有理由将音量设置为.5%,因为您可能会看到它会将主音量设置为一个百分比,因此,假设您想将音量更改为50%
self。音量需要等于50.0,所以只需调用
val=float(int(val))
如果是50.1,它会将50设置为整数,然后将其更改为浮点值
50.0
这是Linux的答案。它如何应用于MS Windows?这个问题指定了Windows。也很抱歉有人这么说,但是更改应用程序的音量取决于您使用的库,如果您使用的是pygame,则为
pygame.mixer.music.set_volume(value)
,再次感谢您的回复。我仍然收到“系统找不到指定的路径”。@f.rodrigues,这在windows上不起作用。路径
/usr
仅在基于unix的系统上。问题是关于windows的。您的答案仅适用于基于unix的系统,它无法回答问题。对于安装LAV筛选器后卷在Win10中停止工作的EventGhost问题,这是一个可行的解决方案。即使在您的“新”答案出现3年后,此问题仍然存在。投票赞成这个,这个例子也适用于所有操作系统?@ChrisP不适用于Mac。喜欢它。手动打开程序,右键单击所需设备,然后单击属性。“命令行友好ID”包含作为参数提供的名称,但它是预编译的。顺便说一句,我知道它在windows上工作,但我不知道linux或mac
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%