为什么停止的 VLC 会抑制暂停?

为什么停止的 VLC 会抑制暂停?

当 VLC 运行时,它可以防止计算机挂起。

我希望它在 VLC 停止(媒体播放完毕)时允许暂停。

如何才能做到这一点?

答案1

我在 Ubuntu 12.04 PC 上遇到了同样的问题。我采纳了 @hbdgaf 的建议,解决了这个问题。看着某个东西睡着了,醒来后发现屏幕保护程序从未出现,这真是太糟糕了。 我的解决方案是用 C 语言编写的是我现在使用的。它是一个守护进程,使用低级 DBus API 调用 VLC 上的方法以获取播放状态,并在 VLC 停止时要求 VLC 退出。bash 和 python 脚本在我的计算机上作为 Ubuntu 启动应用程序运行时不可靠,而这正是我想要的。我不应该每次重新启动时都记得重新启动脚本,对吗?但是,如果手动运行它们,它们会起作用。C 程序没有这个问题。把它放在启动应用程序中,然后忘掉它。

有人告诉我,Ubuntu 14.04 中的 DBus 对象名称有所不同(但 VLC 的屏幕保护程序存在同样的问题)。 org.mpris.MediaPlayer2.vlc.instanceXXXXX在 14.04。 org.mpris.MediaPlayer2.vlc-XXXXX在 12.04。谢谢斯尼特舍尔

猛击使用 GDBus 的解决方案(在我的 Ubuntu 12.04 上默认安装):

#VLC Watchdog Bash Script (vlcwd.sh)
while [ 1 -eq 1 ]
do
    if [ "$(pgrep vlc)" != "" ] #if VLC is running
        then #get the playback status and save to variable pbs
        pbs=$(bash -c 'gdbus call --session \
        --dest org.mpris.MediaPlayer2.vlc-$(pgrep vlc) \
        --object-path /org/mpris/MediaPlayer2 \
        --method org.freedesktop.DBus.Properties.Get \
        "org.mpris.MediaPlayer2.Player" \
        "PlaybackStatus"')
        if [ "$pbs" = "(<'Stopped'>,)" ] #if VLC is stopped
        then kill -9 $(pgrep vlc) #then kill it so it doesn't block my screen saver
        fi
    fi
    sleep 5
done

Python

#vlc_watchdog_daemon.py
import time
time.sleep(30)
import dbus
import os
import subprocess
from subprocess import Popen, PIPE
import daemon

def vlc_killer():
    bus = dbus.SessionBus()
    vlc_media_player_obj = bus.get_object("org.mpris.MediaPlayer2.vlc", "/org/mpris/MediaPlayer2")
    props_iface = dbus.Interface(vlc_media_player_obj, 'org.freedesktop.DBus.Properties')
    pb_stat = props_iface.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')
    if pb_stat == 'Stopped':
        os.system("kill -9 $(pidof vlc)")

def vlc_is_running():
    ps = subprocess.Popen(['ps', '-e'], stdout = PIPE)
    out, err = ps.communicate()
    for line in out.splitlines():
        if 'vlc' in line:
            return True
    return False

def run():
    while True:
        if vlc_is_running():
            vlc_killer()
        else:
            time.sleep(5)

with daemon.DaemonContext():
    run()

答案2

您可以设置 DBus 查询来获取 VLC 的播放状态,并在播放结束后终止进程。这样应该会释放其对挂起状态的控制。

答案3

在新硬盘上安装 Ubuntu 12.04 后,我通过添加解决了这个问题此 ppa如所述这里。我猜这个错误已经在 VLC Player 2.1.3 中修复了。

相关内容