运行 VLC 的 Systemd + Python 脚本不允许 dbus 控制访问 VLC

运行 VLC 的 Systemd + Python 脚本不允许 dbus 控制访问 VLC

好吧,这很奇怪。我一整天都在与这个斗争,但到目前为止还没有成功。我正在开发一个基于 Python 的项目。该项目是通过 systemd 脚本启动的。奇怪的是 vlc/cvlc 在一定程度上可以工作,但没有 dbus 控制。如果我从命令行运行 python 应用程序,一切都会完美运行。从 systemd 运行应用程序是很奇怪的。

例如,当使用以下代码和服务脚本运行它时,我无法使用 dbus 控制 vlc。如果我在 systemd 脚本之外运行 python,我可以访问 dbus。还有另一个奇怪的问题,它是导致此问题的任何因素的副作用。它可以正常运行 1080 vid,但不能运行 4k。尝试一下以下内容,如果您能解决,请告诉我。我非常感谢任何和所有的帮助。谢谢!

Python代码(testvlc):

#!/usr/bin/env python

from subprocess import Popen, PIPE
import time

vid = 'somevideo.mp4'
cmd = 'DISPLAY=:0 cvlc -f --no-osd %s -L' % vid
Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
while True:
    print("Hello!")
    time.sleep(5)

系统脚本(testvlc.service):

[Unit]
Description=Test VLC From Python Script

[Service]
User=user
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc

[Install]
WantedBy=multi-user.target

答案1

[Unit]
Description=Test VLC From Python Script

[Service]
User=user
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc

[Install]
WantedBy=multi-user.target

另外,如果你从中运行它,~/.config/systemd/user一切都会正常运行,包括 4K。将 Wantby 更改为default.target& 添加 a After=graphical-session.target,删除User=& the Environment=, & 使用systemctl --user

答案2

我一直在做类似的事情,从某种意义上说,我想通过 DBus 从 python 控制 VLC。

我所做的是将 VLC 设置为 DBus 可激活服务。为此,我需要做两件事:

  1. 定义DBus服务
  2. 为 VLC 定义 systemd 单元文件,当 dbus 检测到 #1 中的活动时将激活该文件。

对于 DBus 服务,我需要在/usr/share/dbus-1/services.我叫它org.mpris.MediaPlayer2.vlc.service。不幸的是,我找不到在用户目录中设置它的方法。

# /usr/share/dbus-1/services/org.mpris.MediaPlayer2.vlc.service
[D-BUS Service]
Name=org.mpris.MediaPlayer2.vlc
Exec=/bin/false
SystemdService=vlc.service

Name有了这些信息,我们告诉 DBus,与( )定义的总线有关的任何活动org.mpris.MediaPlayer2.vlc都需要激活该服务vlc.service。因此,我们需要通过 systemd 单元文件来定义此类服务。您可以将此文件放置在~/.config/sytemd/user/(对于用户服务)或/usr/lib/systemd/user/(对于系统服务)中。

# vlc.service
[Unit]
Description=VLC media player DBus activated service

[Service]
Type=dbus
BusName=org.mpris.MediaPlayer2.vlc
Environment=""
ExecStart=/home/jbellon/test/ytube-dl/vlc/install/usr/bin/vlc -I "dummy"

注意,这里的服务类型是DBus。您可以在 Systemd 单元文件文档中查看 DBus 服务的属性。

自从我弄对它以来已经有一段时间了(从那以后我不敢改变它),但我认为我在使用时遇到了问题cvlc,所以我直接使用虚拟接口()来执行主程序-I "dummy",这基本上是一样。

一旦我解决了这个问题,您只需要确保 Systemd 知道 VLC 服务 ( systemctl daemon-reload),DBus 也知道(您需要为此重新启动 DBus)。

要测试它,您可以尝试向 DBus 服务查询任何内容,例如内省接口:

$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
   Loaded: loaded (vlc.service; bad; vendor preset: enabled)
   Active: inactive (dead)
$ gdbus introspect --session --dest org.mpris.MediaPlayer2.vlc -o /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2 &> /dev/null
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
   Loaded: loaded (vlc.service; bad; vendor preset: enabled)
   Active: active (running) since Mon 2020-08-17 22:43:53 BST; 1s ago
 Main PID: 56522 (vlc)
    Tasks: 4 (limit: 38349)
   Memory: 2.0M
      CPU: 13ms
   CGroup: /user.slice/user-1000.slice/[email protected]/vlc.service
           └─56522 /usr/bin/vlc -I dummy

相关内容