从 gst 管道总线读取解码后的 zbar 元素消息
reading decoded zbar element messages from gst pipeline bus
使用来自 documentation:
的示例 CLI(命令行界面)管道
gst-launch-1.0 -m v4l2src ! videoconvert ! zbar ! videoconvert ! autovideosink
选项 -m
添加 Output messages posted on the pipeline's bus
我的程序按我预期的方式工作:向网络摄像头显示 QR 码,然后程序打印解码的 QR 数据。如果我向我的网络摄像头出示二维码,我会在终端中得到以下输出:
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.whosebug.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()
然后我对已识别 QR 码的输出变为:
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 界面中使用。我已经尝试为可用 class 对象打印所有可用方法的内容,这些对象似乎与我的目标有很大关系。如何完成这个非常简单的任务?
在网上找不到任何东西后,我决定再次阅读手册以更好地了解背后的机制。答案很简单:message.get_structure().to_string()
我们还可以通过查看 t == Gst.MessageType.ELEMENT
的时间来探测何时触发
使用来自 documentation:
的示例 CLI(命令行界面)管道gst-launch-1.0 -m v4l2src ! videoconvert ! zbar ! videoconvert ! autovideosink
选项 -m
添加 Output messages posted on the pipeline's bus
我的程序按我预期的方式工作:向网络摄像头显示 QR 码,然后程序打印解码的 QR 数据。如果我向我的网络摄像头出示二维码,我会在终端中得到以下输出:
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.whosebug.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()
然后我对已识别 QR 码的输出变为:
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 界面中使用。我已经尝试为可用 class 对象打印所有可用方法的内容,这些对象似乎与我的目标有很大关系。如何完成这个非常简单的任务?
在网上找不到任何东西后,我决定再次阅读手册以更好地了解背后的机制。答案很简单:message.get_structure().to_string()
我们还可以通过查看 t == Gst.MessageType.ELEMENT