Python变更主/应用卷

问题描述 投票:0回答:12

如何更改?

我正在寻找类似的东西:

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

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

提前致谢。

python windows audio volume
12个回答
43
投票

我希望 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()

9
投票

这是一种非常迂回的方法,但它确实有效。您可以使用 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 音量。希望这有点帮助!


3
投票

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

从这里下载此exe应用程序

然后使用 python 调用这个命令

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

3
投票

我从这里撕下了这个并将其修改为仅使用函数。

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

2
投票
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%

0
投票

因此,我没有编辑我的旧答案,而是添加了一个新帖子,以允许其他使用 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()

0
投票

您可以使用

pyautogui

import pyautogui
pyautogui.FAILSAFE = False
x = 1

while x < 10:
    pyautogui.press('volumedown')
    x+=1

0
投票
import pyautogui

x = 50
a = (x//2)
pyautogui.press('volumeup',a)

#this code will increase computer master volume by even numbers

0
投票

您可以在 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) 

0
投票

使用辅助功能的一个衬垫

如果未安装,请运行:

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)


-1
投票

第一个导入子流程

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

-1
投票

我找到了一种使用 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)} %')
© www.soinside.com 2019 - 2024. All rights reserved.