耳机断开时如何暂停VLC播放?

当耳机插入时,如何暂停播放VLC? 我可以通过ALSA将扬声器静音,但我想使用插头触发器来停止播放,就像在智能手机中一样。

好的,基于我从这里学到的东西 ,我正在尝试一种新的方法,使用ACPI。

  1. 创建一个脚本,用于暂停和取消暂停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 
  2. 现在让我们创建一个事件触发器(用您喜欢的文本编辑器替换vim ):

     sudo vim /etc/acpi/events/headphones 

    并添加以下内容:

     event=jack/headphone action=/etc/acpi/headphone_jack.sh %e 
  3. 最后,重新启动ACPI守护程序:

     sudo service acpid restart 

我认为应该完全符合您的要求,不涉及任何民意调查。 我可以通过此实现找到的唯一缺点是,如果您有多个用户同时运行VLC。 我想在那种情况下,可能会发生的是,这种方法将随机暂停并恢复其中一种(或者它可能根本不起作用)。

感谢@int_ua和@Sneetsher向我提供有关ACPI事件处理的重要知识。 同时赞成@ user3073656以帮助简化程序。

好的,所以你需要为此做一些事情:

  1. 拔出耳机时检测;
  2. 在(1)中的事件之后,向VLC发送“暂停”命令;
  3. 检测耳机重新插入的时间;
  4. 在(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来检测事件变化(甚至可能是其他方法),但这个方法应该让你开始(其他人超过我的技能水平和经验)。 我想你可以从这种“hackish”方法开始,并从这里开始构建。