如何在python中获得系统输出音量?

时间:2018-04-05 01:34:29

标签: python python-3.x audio pyaudio

我正在开发一个需要在Python中获取当前系统音频输出级别的项目。基本上,我想知道扬声器发出的当前声音在Linux系统上使用Python有多大声。我不需要知道扬声器的确切音量,相对音量是我正在寻找的。我没有在网上找到任何好的资源。

2 个答案:

答案 0 :(得分:1)

tl; dr - 在macOS上获取离散系统输出量的另一种方法。

在看到您的问题并了解到我无法在macOS上构建pyalsaaudio之后,我想为如何在macOS上专门提供一个额外的答案,因为它& #39;不是以跨平台的方式抽象的。

(我知道这对你的直接使用案例有帮助,但我有预感我并不是唯一一个会因为这个问题而感到沮丧的Mac用户对我们也可以运行的解决方案感兴趣。)

在macOS上,你可以get the output volume运行一点AppleScript:

$ osascript -e 'get volume settings'
output volume:13, input volume:50, alert volume:17, output muted:false

我在Python函数中将该调用包装起来,将音量+静音状态解析为一个简单的0-100范围:

import re
import subprocess


def get_speaker_output_volume():
    """
    Get the current speaker output volume from 0 to 100.

    Note that the speakers can have a non-zero volume but be muted, in which
    case we return 0 for simplicity.

    Note: Only runs on macOS.
    """
    cmd = "osascript -e 'get volume settings'"
    process = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
    output = process.stdout.strip().decode('ascii')

    pattern = re.compile(r"output volume:(\d+), input volume:(\d+), "
                         r"alert volume:(\d+), output muted:(true|false)")
    volume, _, _, muted = pattern.match(output).groups()

    volume = int(volume)
    muted = (muted == 'true')

    return 0 if muted else volume

例如,在各种音量条设置的MacBook Pro上:

>>> # 2/16 clicks
>>> vol = get_speaker_output_volume()
>>> print(f'Volume: {vol}%')
Volume: 13%
>>> # 2/16 clicks + muted
>>> get_speaker_output_volume()
0
>>> # 16/16 clicks
>>> get_speaker_output_volume()
100

答案 1 :(得分:0)

https://askubuntu.com/a/689523/583376的此片段是否提供了您正在寻找的信息?

首先,>>> import alsaaudio >>> m = alsaaudio.Mixer() >>> vol = m.getvolume() >>> vol [50L] 然后运行以获取音量:

package main

import (
    "io"
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "crypto/rand"
)

func encrypt(key, data []byte) string {
    block, err := aes.NewCipher(key)
    if err != nil {
      return nil, err
    }
    encoded := base64.StdEncoding.EncodeToString(data)
    ciphertext := make( []byte, aes.BlockSize+len(encoded) )
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
      return nil, err
    }
    cfb := cipher.NewCFBEncrypter(block, iv)
    cfb.XORKeyStream( ciphertext[aes.BlockSize:], []byte(encoded) )
    return ciphertext, nil
}

注意:此代码是从链接答案的后半部分复制的。我在Mac上,所以无法实际运行它,因为lib不会在macOS上构建,但是它一眼就能在Linux上提供当前的系统音频输出级别。