如何更改?
我正在寻找类似的东西:
SetMasterVolume(0.5)
SetAppVolume('FooBar',0.5)
我尝试使用ctypes.windll.winmm,但我找不到太多关于如何使用它的文档。
提前致谢。
我希望 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()
这是一种非常迂回的方法,但它确实有效。您可以使用 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 音量。希望这有点帮助!
我知道这已经太晚了,但如果有人仍在寻找无缝解决方案
然后使用 python 调用这个命令
./SoundVolumeView.exe /SetVolume "High Definition Audio Device\Device\Speakers" 50
我从这里撕下了这个并将其修改为仅使用函数。
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()
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%
因此,我没有编辑我的旧答案,而是添加了一个新帖子,以允许其他使用 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()
您可以使用
pyautogui
:
import pyautogui
pyautogui.FAILSAFE = False
x = 1
while x < 10:
pyautogui.press('volumedown')
x+=1
import pyautogui
x = 50
a = (x//2)
pyautogui.press('volumeup',a)
#this code will increase computer master volume by even numbers
您可以在 pyautogui 中设置按下次数并创建偶数输出
例如43 个输入 = 42 个输出
使用进口:
import pyautogui as p
import math, time
from tkinter import simpledialog
使用 tkinter Askdialog 获取输入
volume = simpledialog.askinteger("new volume", "what would you like the volume to be?")
并设置音量
def set_vol(new_volume):
p.press('volumedown', presses = 50) #sets volume to zero
time.sleep(0.5) #using time.sleep to space the presses
x = math.floor(new_volume / 2) #setting the amount of presses required
p.press('volumeup', presses = x) #setting volume
运行定义
set_vol(volume)
如果未安装,请运行:
pip install pynput
"""
You must set n to the volume levels your computer has.
x: volume in percent, 0 min, 1 max
"""
def set_volume(x):
n = 100 # volume levels your computer has
keyboard = Controller()
pause = 0.0001
desired_level = int(x*n)
# go to 0 first since we dont know the current volume level
press_count = int(n/2)
for _ in range(press_count):
keyboard.press(Key.media_volume_down)
keyboard.release(Key.media_volume_down)
time.sleep(pause)
press_count = int(desired_level/2)
for _ in range(press_count):
keyboard.press(Key.media_volume_up)
keyboard.release(Key.media_volume_up)
time.sleep(pause)
示例:
set_volume(0.5)
第一个导入子流程
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()
我找到了一种使用 numpy 设置主音量的方法,同时仍然使用 Pycaw。
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
import numpy as np
获取音频输出设备
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
以百分比形式设置所需音量(0 至 100)
desired_vol = 50
获取音量范围(最小值和最大值,以 dB 为单位)
vol_range = volume.GetVolumeRange()
min_vol = vol_range[0]
max_vol = vol_range[1]
将所需的音量百分比转换为以 dB 为单位的音量级别
desired_vol_db = np.interp(desired_vol, [0, 100], [min_vol, max_vol])
volume.SetMasterVolumeLevelScalar(desired_vol / 100, None)
打印当前音量百分比
curr_vol = int(volume.GetMasterVolumeLevelScalar() * 100)
print(f'Volume set to: {int(curr_vol)} %')