微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 gst 管道总线读取解码的 zbar 元素消息

如何解决从 gst 管道总线读取解码的 zbar 元素消息

使用来自 documentation 的示例 CLI(命令行界面)管道:

gst-launch-1.0 -m v4l2src ! videoconvert ! zbar ! videoconvert ! autovideosink

使用添加 -m 的选项 Output messages posted on the pipeline's bus 我的程序按我的预期工作:向网络摄像头显示二维码,然后程序打印解码的二维码数据。如果我向网络摄像头显示二维码,我会在终端中得到以下输出

Got message #103 from element "zbar0" (element): barcode,timestamp=(guint64)5069092054,stream-time=(guint64)5069092054,running-time=(guint64)5069092054,type=(string)QR-Code,symbol=(string)http://www.stackoverflow.com,quality=(int)1,duration=(guint64)100000000;

如果我把这个管道变成 Python 代码

import sys
import gi
gi.require_version('Gst','1.0')
from gi.repository import GObject,Gst,GLib

def bus_call(bus,message,loop):

    print("message:",message)
    print("message.src:",message.src)
    print("message.src.get_name():",message.src.get_name())

    t = message.type
    if t == Gst.MessageType.EOS:
        sys.stdout.write("End-of-stream\n")
        loop.quit()
    elif t == Gst.MessageType.WARNING:
        err,debug = message.parse_warning()
        sys.stderr.write("Warning: %s: %s\n" % (err,debug))
    elif t == Gst.MessageType.ERROR:
        err,debug = message.parse_error()
        sys.stderr.write("Error: %s: %s\n" % (err,debug))
        loop.quit()
    return True

def my_pipeline():

    Gst.init(None)

    # Create Pipeline
    pipeline = Gst.parse_launch("v4l2src device=/dev/video0 ! \
                                 videoconvert ! video/x-raw,width=640,height=480,framerate=30/1 ! \
                                 videoconvert ! zbar ! videoconvert ! autovideosink")

    # Create stream loop
    loop = GLib.MainLoop()

    # Setup pipeline bus
    bus = pipeline.get_bus()
    bus.add_signal_watch()
    bus.enable_sync_message_emission()
    bus.connect("message",bus_call,loop)

    print("Starting pipeline...\n")
    
    pipeline.set_state(Gst.State.PLAYING)
    try:
        loop.run()
    except:
        pass
    pipeline.set_state(Gst.State.NULL)

if __name__ == '__main__':
    my_pipeline()

然后我对已识别二维码输出变为:

message:                  <Gst.Message object at 0x7fe13a4d1880 (GstMessage at 0x11a75a0)>
message.src:              <__gi__.GstZBar object at 0x7fe13a4ebdc0 (GstZBar at 0x11888d0)>
message.src.get_name():   zbar0

无论我尝试打印什么,似乎都无法将解码后的消息输出。最好我想要 CLI 给出的完整输出结构。经过大量搜索,我了解到 -m 之类的选项只允许在 CLI 界面中使用。我已经尝试打印似乎与我的目标甚至远程相关的可用类对象的所有可用方法内容。如何完成这个非常简单的任务?

解决方法

在网上找不到任何东西后,我决定再次阅读手册以更好地了解背后的机制。答案很简单:message.get_structure().to_string()

我们也可以通过查看何时触发t == Gst.MessageType.ELEMENT

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?