当我的耳机被拔出时,如何暂停 VLC 的播放?我可以通过 ALSA 将扬声器静音,但我想使用插头触发器来停止播放,就像在智能手机中一样。
答案1
好的,因此您需要为此做一些事情:
- 检测耳机何时被拔出;
- 在(1)中的事件发生后,向 VLC 发送“暂停”命令;
- 检测耳机何时重新插入;
- (3)中的事件发生后,向VLC发送“播放”命令;
对于 (1) 和 (3):您可以使用显示的内容这里。该答案包含一个小程序,用于查找插入和拔出插孔之间的区别,以及您可以修改以符合您的情况的脚本。
对于 (2) 和 (4):您应该使用 VLC 的 Dbus 接口。相关代码应该是这样的:
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play
分别用于暂停和播放。
现在,关于脚本。对于你来说,它应该看起来像这样:
#!/bin/bash
# This scripts detecs unplugging headphones.
oldstatus="unrelated string"
while [ 1 ]; do
# The following line has to be changed depending on the difference (use diff) in '/proc/asound/card0/code#0'
status=$(grep -A 4 'Node 0x16' '/proc/asound/card0/codec#0' | grep 'Amp-Out vals: \[0x80 0x80\]')
if [ "$status" != "$oldstatus" ]; then
if [ -n "$status" ]; then
echo "Plugged in"
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play
oldstatus="$status"
else
echo "Unplugged"
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause
oldstatus="$status"
fi
fi
# Now sleep for 250 milli-seconds as per @Serg's request (who learnt if from @Fabby)
# sleep is timer-based so doesn't use *any* processor cycles while sleeping.
sleep 0.25
done
将修改后的脚本添加到启动应用程序中,一切就绪。我认为它应该可以完成您想要的操作。
PS - 请注意,还有更有效的方法可以做到这一点,例如使用inotify
来检测事件变化(甚至可能是其他方法),但这种方法应该可以让您入门(其他方法超出了我的技能水平和经验)。我想您可以从这种“黑客”方法开始,然后从这里开始。
答案2
好的,根据我从这里,我正在尝试一种新方法,使用 ACPI。
创建一个脚本,用于暂停和取消暂停 VLC:
sudo touch /etc/acpi/headphone_jack.sh sudo chmod +x /etc/acpi/headphone_jack.sh
并将以下内容放入此文件中:
_pid=`pgrep vlc` _pid="${_pid% *}" DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$_pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'` _username=`grep -z USER= /proc/$_pid/environ |sed 's/.*=//'` if [ "$3" = unplug ]; then su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause" else su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play" fi
现在让我们创建一个事件触发器(
vim
用您最喜欢的文本编辑器替换):sudo vim /etc/acpi/events/headphones
并添加以下内容:
event=jack/headphone action=/etc/acpi/headphone_jack.sh %e
最后,重新启动 ACPI 守护进程:
sudo service acpid restart
我认为应该正是您所需要的,不涉及轮询。我发现此实现的唯一缺点是如果有多个用户同时运行 VLC。我想在这种情况下,可能发生的情况是这种方法会随机暂停并恢复其中一个(或者它可能根本不起作用)。
非常感谢@int_ua 和@Sneetsher 为我提供有关 ACPI 事件处理的重要知识。同时还要感谢@user3073656 帮助简化了流程。