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%