有没有办法在linux下使用命令控制连接的蓝牙设备卷?

时间:2015-01-28 11:39:32

标签: linux unix bluetooth linux-device-driver

我怀疑, 假设我已将蓝牙耳机连接到我的linux系统(蓝牙设备已配对并成功连接)。

我可以使用“bluetoohctl”命令检查我的蓝牙设备MAC ID。

我怀疑是否可以使用linux中的某些命令控制蓝牙设备音量。

有人可以帮我解决这个问题。

5 个答案:

答案 0 :(得分:2)

使用此方法,您需要适当的D-Bus对象路径来控制设备。有几种方法可以找到(比如使用D-Feet),但是一旦你拥有它,下面的命令就会调整音量:

dbus-send --print-reply --system --dest=org.bluez /org/bluez/xxxx/yyyy/dev_zz_zz_zz_zz_zz_zz org.bluez.Control.VolumeUp

其中" xxxx" 似乎成为 bluetoothd 的PID," yyyy"是适配器(如" hci0")," zz_zz_zz ..."表示由下划线分隔的受控设备(耳机,扬声器等)的MAC地址,以及' VolumeUp '被替换为' VolumeDown '减少音量。

有关正确查找对象路径的更多帮助,请参阅D-Bus文档。要做的不仅仅是调整音量,请参阅Bluez API文档。

答案 1 :(得分:1)

我想通过PulseAudio进行设备枚举,因为我不仅仅需要控制蓝牙设备。这依赖于Sean的建议,即使用DBus将命令实际推送到蓝牙设备。

Python库pulsectl使查找这些设备标识符变得简单。 Sean建议使用D-Feet非常适合找出更新后的方法名称。

一个最完整的例子是:

from pulsectl import Pulse
import subprocess

# diff applies to non-BT Pulse devices
diff = 0.1
method = 'org.bluez.MediaControl1.Volume{}'.format(
  'Down' if diff < 0 else 'Up')

with Pulse() as pulse:
  for sink in pulse.sink_list():
    bluez_path = sink.proplist.get('bluez.path')
    if bluez_path:
        args = [
            'dbus-send', '--system', '--print-reply',
            '--dest=org.bluez', bluez_path, method,
        ]
        subprocess.run(args, check=True)
    else:
        pulse.volume_change_all_chans(sink, diff)

我从命令行得到类似于diff的内容,允许对音量级别进行相对理智的控制。

答案 2 :(得分:1)

不是一个正确的答案,而是一个解释:大多数蓝牙耳机有2种不同的音量:软件音量和硬件音量。传统上,在Linux上,您只能控制软件,但是耳机可以具有额外的内部硬件容量,当前无法控制。已有错误报告:

如果有人知道如何控制硬件内部音量,请在下面答复。

答案 3 :(得分:1)

我用我的 i-phone 将我的 Sony Headphones 中的硬件音量设置为 MAX。 Ubunto 20.04 LTS 中音量的后记控制工作正常。

步骤

  1. 从 Ubuntu 断开蓝牙耳机
  2. 通过蓝牙将耳机连接到 i-phone
  3. 打开一个 YouTube 视频并一直调高音量。
  4. 断开耳机与手机的连接
  5. 将蓝牙耳机连接到您的 Ubuntu 机器

声音现在应该是完全可调的。

答案 4 :(得分:1)

您可以将设备的内部音量设置为特定值,而不是使用外壳向上或向下递增:

  1. 找到您的 BT 耳机的 MAC 地址(对于 DBus 兼容的 MAC 值,我们将用下划线替换冒号):
$ bluetoothctl devices | sed "s/:/_/g"
Device A1_B2_C3_D4_E5_F6 Some Headset
  1. 找到允许控制耳机内部音量的 DBus 对象:
$ dbus-send --system --print-reply --dest=org.bluez / org.freedesktop.DBus.ObjectManager.GetManagedObjects | less
  1. 当它通过管道传送到 less 时,搜索接口 org.bluez.MediaTransport1(按反斜杠 \,键入 MediaControl1,按 Enter)并记录 {{1} 的值}}:
object path

您应该在几行下方的那个块中看到一个名为 object path "/org/bluez/hci0/dev_A1_B2_C3_D4_E5_F6/sep1/fd0" array [ dict entry( string "org.bluez.MediaTransport1" 的属性 (如果不存在,则耳机对象不支持直接设置音量):

Volume
  1. 首先获取当前音量(此处报告为 dict entry( string "Volume" variant uint16 90 ):
60
  1. 让我们将音量增加 10 - 不要直接调到最大或太大,因为这可能会损坏您的设备和/或您的听力。
$ dbus-send --system --print-reply --dest=org.bluez /org/bluez/hci0/dev_A1_B2_C3_D4_E5_F6/sep1/fd0 org.freedesktop.DBus.Properties.Get string:"org.bluez.MediaTransport1" string:"Volume" | grep uint16 | awk '{print $3}'
60

在我的设备上,范围似乎是 0-127,有些值超过 110 会产生失真。请注意您提供的值以避免损坏。