为什么 gStreamer 从 waylandsink 中抛出错误?

Why is gStreamer throwing an error from waylandsink?

我正在从事 Smart Birdfeeder 项目 (https://github.com/google-coral/project-birdfeeder) 当 运行ning birdfeeder.sh 在开发板上使用 Coral 相机时,我得到:

** (python3:3933):严重 **:16:37:50.961:无法刷新 Wayland 连接

错误在终端 window 中涌现并淹没了输出,直到我 ^Z 退出程序。 "python3:" 后面的数字对于给定的 运行 是不变的,但在不同的 运行 中会有所不同。 如果我将视频监视器插入开发板上的 HDMI 插座和 运行 程序,来自摄像机的实时图像会显示在监视器中,如果我在摄像机前拿着一张鸟的照片,程序运行,摄像机的图像被保存,鸟的正确识别被写入日志文件。 这是管道代码:

def run_pipeline(user_function,
                     src_size=(640,480),
                     appsink_size=(320, 180)):
        PIPELINE = 'v4l2src device=/dev/video0 ! {src_caps} ! {leaky_q}  ! tee name=t'
        if detectCoralDevBoard():

        # Test framerate of 1/1 on 200212 (line 69), then 10/1 back to 30/1

            SRC_CAPS = 'video/x-raw,format=YUY2,width={width},height={height},framerate=30/1'
            PIPELINE += """
                t. ! {leaky_q} ! glupload ! glfilterbin filter=glcolorscale
                   ! {dl_caps} ! videoconvert ! {sink_caps} ! {sink_element}
                t. ! {leaky_q} ! glupload ! glfilterbin filter=glcolorscale
                   ! rsvgoverlay name=overlay ! waylandsink
            """

我对 gstreamer 没有经验,需要任何帮助。谢谢

问得好,但我不熟悉这个程序,而且我的珊瑚板上没有显示器。但是,这里有一些想法供您开始调查。我刚接触 gstreamer (GST),我觉得它很酷!

  1. PIPELINE 字符串被送入 GST 解析器以构建处理数据流。流水线的每一步都用感叹号 (!) 分隔,可以是插件或内部功能。示例中的管道相当复杂,我怀疑某些步骤是不必要的。看起来只有一个来源——珊瑚板相机和两个水槽。每个对 t. 的引用都是一个新的处理线程:一个转到 {sink_element}(这是在 python 脚本某处定义的字符串),另一个转到 waylandsink。 source 和sink 之间的元素以pipeline 中prior 元素的sink 为source 做某种转换。例如,videoconvert 插件经常用于神奇地将源视频信号转换为接收器可以使用的信号。 glupload是一个opengl插件,可以将视频转换为opengl着色(我不清楚是否有必要。)我不认识其他一些插件。

  2. 我猜是 waylandsink 插件引发了您的错误。您可以在 waylandsink 查看文档。您可能需要查看 C 源代码以了解它生成严重错误的原因,但如果视频正在本地监视器上显示,则它不应该是严重错误。

  3. python3:NNN字符串中的NNN号是python线程的进程ID。可能对您没有意义,但 GST 是大量多线程的,因此有助于调试。

祝你好运!

致所有努力在 Coral Dev-Board 运行 上以无头模式且没有活动终端会话(注册为 Systemd 服务或类似服务)的 GStreamer。 我发现了一个糟糕的 hack(现在也以类似的方式包含在较新的 Coral 示例代码中):

os.environ["XDG_RUNTIME_DIR"] = "/run/user/1000"

将其放入 python 代码中,您将 GStreamer 管道放在一起。

我之前在一些 Google 代码中看到的另一件事是将消息注入 gstreamer 总线以取悦要求当前显示的元素。