我正在开发一个需要在Python中获取当前系统音频输出级别的项目。基本上,我想知道扬声器发出的当前声音在Linux系统上使用Python有多大声。我不需要知道扬声器的确切音量,相对音量是我正在寻找的。我没有在网上找到任何好的资源。
答案 0 :(得分:1)
在看到您的问题并了解到我无法在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上提供当前的系统音频输出级别。