Casey Keller Asked: 2010-10-20 20:20:13 +0800 CST2010-10-20 20:20:13 +0800 CST 2010-10-20 20:20:13 +0800 CST 自动连接蓝牙设备 772 有没有办法将 Ubuntu 中的蓝牙设置为在打开时自动连接到它配对的设备。此外,有没有办法在连接时自动将声音输出更改为蓝牙耳机? sound configuration pulseaudio bluetooth 2 个回答 Voted Best Answer Takkat 2010-10-20T23:59:21+08:002010-10-20T23:59:21+08:00 脉冲音频 >= 1.0 通过编辑,/etc/pulse/default.pa我们可以加载 pulseaudio 模块module-switch-on-connect以在它呈现给 pulseaudio 声音服务器时自动连接到音频接收器。我们需要插入以下行 load-module module-switch-on-connect 以前版本的pulseaudio 蓝牙设备一出现,就会在 PulseAudio 中被识别。但是,需要在音频设置中手动进行连接。有一个允许一键连接到 BT 设备 ( stream2ip ) 的 GUI。 编辑:从 0.2.5 版开始,stream2ip 允许自动连接到蓝牙设备。 编辑:如果没有蓝牙设备,您可以将您的 bluez 设备设置为默认设备(例如,通过使用 pactl 或在配置设置中)并回退到内部音频。 编辑:这是一个快速而肮脏的 Python 脚本,可让您了解如何完成这项工作: #!/usr/bin/env python #-*- coding: utf-8 -*- # # bt-autoconnect # Autoconnects Bluetooth Devices to PulseAudio # (c) Takkat Nebuk # Licence: GPLv3 # usage: # bt-autoconnect <MAC> <timeout> import subprocess import time import sys import string cli_options = sys.argv def main(): MAC = cli_options[1] timeout = cli_options[2] PMAC = string.replace(MAC,':','_') # PA don't know ':', needs '_' pa_args = ['pacmd set-default-sink bluez_sink.' + PMAC] bt_args = ['sdptool browse ' + MAC] err = False while err == False: if subprocess.call(bt_args, shell=True) == 0: err = subprocess.call(pa_args, shell=True) time.sleep(int(timeout)) exit() if __name__ == "__main__": main() 只需复制此脚本并将其保存为bt-autoconnect.py。使脚本可执行或从命令行(推荐)运行它cd /script/directory,然后键入: python bt-autoconnect.py [MAC] [timeout] 将MAC替换为您的蓝牙设备的 MAC(例如 00:0C:78:4F:B6:B5),并在脚本查找设备时以秒为单位设置所需的超时时间(例如 10)。然后,此脚本将在蓝牙设备的每个超时秒内侦听给定的MAC,并将其连接到 PulseAudio(如果存在)。该脚本将永远运行,直到它被杀死或虚拟终端被关闭。 有时 PulseAudio 似乎没有意识到设备在关闭后再次出现。带着一些希望pulseaudio -k让它重新出现。 不花哨,没有 GUI,但至少在我的设置中它工作正常。 为感兴趣的人编辑:发布了带有 GUI 的bt-autoconnect以方便设置。请在那里提交错误或建议。感谢您的测试。 domen 2013-03-22T00:08:28+08:002013-03-22T00:08:28+08:00 不幸的是,我现在才看到 Takkat 的答案,这似乎是比我更好的方法。 我想这可能仍然与 Pulseaudio < 1.0 相关。它不使用轮询,而是在 dbus 上监听蓝牙事件: #!/usr/bin/python # based on monitor-bluetooth # Changes by Domen Puncer <[email protected]> import gobject import dbus import dbus.mainloop.glib import os # we want this event: {AudioSource.PropertyChanged} [/org/bluez/16797/hci0/dev_00_24_7E_51_F7_52] State = playing # and when that happens: pactl load-module module-loopback source=bluez_source.00_24_7E_51_F7_52 sink=alsa_output.pci-0000_00_1b.0.analog-stereo def property_changed(name, value, path, interface): iface = interface[interface.rfind(".") + 1:] val = str(value) print "{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val) if iface == "AudioSource" and name == "State" and val == "playing": bt_addr = "_".join(path.split('/')[-1].split('_')[1:]) cmd = "pactl load-module module-loopback source=bluez_source.%s sink=alsa_output.pci-0000_00_1b.0.analog-stereo" % bt_addr os.system(cmd) def object_signal(value, path, interface, member): iface = interface[interface.rfind(".") + 1:] val = str(value) print "{%s.%s} [%s] Path = %s" % (iface, member, path, val) if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() bus.add_signal_receiver(property_changed, bus_name="org.bluez", signal_name = "PropertyChanged", path_keyword="path", interface_keyword="interface") mainloop = gobject.MainLoop() mainloop.run()
脉冲音频 >= 1.0
通过编辑,
/etc/pulse/default.pa
我们可以加载 pulseaudio 模块module-switch-on-connect以在它呈现给 pulseaudio 声音服务器时自动连接到音频接收器。我们需要插入以下行以前版本的pulseaudio
蓝牙设备一出现,就会在 PulseAudio 中被识别。但是,需要在音频设置中手动进行连接。有一个允许一键连接到 BT 设备 ( stream2ip ) 的 GUI。
编辑:从 0.2.5 版开始,stream2ip 允许自动连接到蓝牙设备。
编辑:如果没有蓝牙设备,您可以将您的 bluez 设备设置为默认设备(例如,通过使用 pactl 或在配置设置中)并回退到内部音频。
编辑:这是一个快速而肮脏的 Python 脚本,可让您了解如何完成这项工作:
只需复制此脚本并将其保存为bt-autoconnect.py。使脚本可执行或从命令行(推荐)运行它
cd /script/directory
,然后键入:将MAC替换为您的蓝牙设备的 MAC(例如 00:0C:78:4F:B6:B5),并在脚本查找设备时以秒为单位设置所需的超时时间(例如 10)。然后,此脚本将在蓝牙设备的每个超时秒内侦听给定的MAC,并将其连接到 PulseAudio(如果存在)。该脚本将永远运行,直到它被杀死或虚拟终端被关闭。
有时 PulseAudio 似乎没有意识到设备在关闭后再次出现。带着一些希望
pulseaudio -k
让它重新出现。不花哨,没有 GUI,但至少在我的设置中它工作正常。
为感兴趣的人编辑:发布了带有 GUI 的bt-autoconnect以方便设置。请在那里提交错误或建议。感谢您的测试。
不幸的是,我现在才看到 Takkat 的答案,这似乎是比我更好的方法。
我想这可能仍然与 Pulseaudio < 1.0 相关。它不使用轮询,而是在 dbus 上监听蓝牙事件: