在Raspberry Pi上使用带有omxplayer的go.dbus

ee7vknir  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(88)

我试图使用omxplayer上的D-Bus接口来控制正在运行的视频。我正在尝试使用go.dbus库,可以在这里找到:https://github.com/guelfey/go.dbus
omxplayer文档提供了一个dbuscontrol.sh脚本,我可以成功地使用它。它设置一些环境变量,然后可以使用dbus-send来查询omxplayer。
我试图在Go语言中重现这一点,但我一直得到错误“名称org.mpris.MediaPlayer2未由任何.service文件提供”
下面是我的代码:

package main

import (
    "encoding/json"
    "fmt"
    "os"

    "github.com/guelfey/go.dbus"
    "github.com/guelfey/go.dbus/introspect"
)

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)
}
ifmq2ha2

ifmq2ha21#

OMXplayer不使用系统或会话总线,而是使用自己的总线,该总线的路径是OMXPLAYER_DBUS_ADDR环境变量指向的文件的内容。
您可以看到,dbuscontrol.sh脚本在第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...
}

相关问题