我有索尼蓝牙耳机已连接到 Ubuntu 20.04。它们运行良好,蓝牙可以重新连接,我甚至可以(mpris)从中控制玩家。
我的问题是,如果我在连接时忘记关闭,耳机会在一夜之间耗尽电池。我检查了一下,耳机方面没有办法在没有声音时自动关闭它。
但是,当没有蓝牙连接时,耳机会自动关闭。因此,我认为我唯一的好选择是让 Ubuntu 在一段时间的静默后断开蓝牙连接。
当没有声音时,是否有这样的选项可以自动断开蓝牙音频设备?
除了在“设置”窗口中的配置外,我找不到蓝牙设备的太多配置:
答案1
经过一番搜索,我找到了以下解决方案这个答案,运行时有效脉冲音频:
使用命令pacmd list-sink-inputs
可以查看所有音频接收器。输出如下所示:
“pacmd list-sink-inputs”的示例输出
这里的解决方案很重要state: RUNNING
,sink: 31 <bluez_sink.[hardware address].a2dp_sink>
因为有了这些信息,我们就可以检查音频当前是否通过蓝牙进行流式传输。蓝Z是运行 Linux 蓝牙服务的技术。连接但没有播放音乐的接收器将具有以下状态state: CORKED
基于此信息,现在可以使用该包更改蓝牙适配器的状态bluez-tools
. 更具体地说,该命令bt-adapter --set Powered false
用于在需要时关闭适配器。这里是所有选项和命令的链接。
我编写了一个 bash 脚本,它会不定期地检查 PC 是否正在通过蓝牙传输音频,如果没有,则会在给定的超时时间后关闭蓝牙适配器。请原谅我的脚本,这只是我用 bash 编写的第二个脚本。
#!/bin/bash
deviceName="WH-1000XM3" # Name of the BT-Device
timeout=120 # Delay in seconds after which Device is disconnected
halfTimeout=$((timeout / 2))
# Checks if Sound is played via BT.
# Returns true if sound is play and false if not.
checkBTSound() {
sinks=$(pacmd list-sink-inputs) # Gets all sinks
# Check if "bluez_sink" is in the list of sinks and if it also has
# "state: RUNNING".
[[ ("$sinks" == *"bluez_sink"*) &&\
("$sinks" == *"state: RUNNING"*) ]] && true || false
}
# Checks if specified BT-Device is connected
# Returns "true" if connected, "false" else.
deviceIsConnected() {
response=$(bt-device -i $deviceName)
[[ "$response" == *"Connected: 1"* ]] && true || false
}
# Endless Loop
while :
do
counting=false
inital=true
notification=false
start=1
# Only take action, if device is connected and no sound is streaming.
while
(! checkBTSound && deviceIsConnected) && true || false
do
# Sound has stopped playing. Start counting.
counting=true
# Only on first loop mark the time to calc the duration later.
if $inital; then
inital=false
start=$SECONDS
fi
# Calculate time passed since first loop.
timePassed=$(($SECONDS - $start))
# Check if half of timeout time has passed and send notification if that is
# the case and the notification has not already been sent.
if [ $timePassed -ge $halfTimeout ] && ! $notification; then
notify-send "Headphone Timeout"\
"Headphone will be disconnected in $halfTimeout seconds."
notification=true
# Check if timout time has been surpassed and take corresponding actions if
# that is the case.
elif [ $timePassed -ge $timeout ]; then
# Sending notification
notify-send "Headphone Timeout"\
"Disconnecting headphones \"$deviceName\"."
# Disconnecting specified device
bt-device -d $deviceName
# Go back to outer loop waiting for device to connect again
break
fi
sleep 1
done
sleep 5
done
编辑: 您还可以使用以下方式断开设备连接
bt-device --disconnect=<Name of your Device>
这样您就不必关闭适配器。名称是人性化的设备名称,您也可以在蓝牙设置中将其更改为您喜欢的任何名称。
答案2
这是我的“蓝牙设备断开脚本”版本 https://github.com/pymen/bt_auto_disconnect
它使用 cron 进行定期检查,如果最后 N 次检查都没有声音,它会断开蓝牙设备