我正在尝试在omxplayer上使用D-Bus接口来控制正在运行的视频。我尝试使用此处的go.dbus库:https://github.com/guelfey/go.dbus
omxplayer文档提供了一个我可以成功使用的dbuscontrol.sh脚本。它设置了一些环境变量,然后可以使用dbus-send来查询omxplayer。
我试图在Go中重现这一点,但我一直收到错误"任何.service文件都没有提供名称org.mpris.MediaPlayer2"
这是我的代码:
package main
import (
"encoding/json"
"fmt"
"github.com/guelfey/go.dbus"
"github.com/guelfey/go.dbus/introspect"
"os"
)
func main() {
os.Setenv("OMXPLAYER_DBUS_ADDR", "/tmp/omxplayerdbus.pi")
os.Setenv("OMXPLAYER_DBUS_PID", "/tmp/omxplayerdbus.pi.pid")
conn, err := dbus.SessionBus()
if err != nil {
panic(err)
}
node, err := introspect.Call(conn.Object("org.mpris.MediaPlayer2.omxplayer", "/org/mpris/MediaPlayer2"))
if err != nil {
fmt.Println(err)
}
data, _ := json.MarshalIndent(node, "", " ")
var s []string
err = conn.BusObject().Call("org.freedesktop.DBus.ListNames", 0).Store(&s)
if err != nil {
fmt.Fprintln(os.Stderr, "Failed to get list of owned names:", err)
os.Exit(1)
}
fmt.Println("Currently owned names on the session bus:")
for _, v := range s {
fmt.Println(v)
}
os.Stdout.Write(data)
}
答案 0 :(得分:0)
OMXplayer不使用系统或会话总线,而是使用自己的总线,该总线的路径是OMXPLAYER_DBUS_ADDR
环境变量指向的文件的内容。
您可以看到dbuscontrol.sh脚本在lines 5-8(特别是第7行)上进行了设置。
以您为例,您需要打开该文件,读取其内容,并将其用于对dbus.Conn.Dial()
的调用中。
类似的事情可能起作用:
import (
"log"
"io/ioutil"
"github.com/guelfey/go.dbus"
)
func getOMXPlayerDBUSAddr() string {
content, err := ioutil.ReadFile("/tmp/omxplayerdbus.pi")
if err != nil {
log.Fatal(err)
}
return string(content)
}
func main() {
conn, err := dbus.Dial(getOMXPlayerDBUSAddr())
if err != nil {
panic(err)
}
// The rest of the code goes here
node, err := introspect...
}