【问题标题】:GStreamer How to extract video frame from the flow?GStreamer 如何从流中提取视频帧?
【发布时间】:2012-08-23 01:35:56
【问题描述】:

这是用于从服务器捕获流式视频的 python 代码。但我需要编写一个函数来从流中提取一帧。这将是一个按钮。单击它会显示当前帧。我没有想法。谁能帮我这个???

    self.player = gst.Pipeline("player")
    self.source = gst.element_factory_make("uridecodebin", "video-source")
    #self.source = gst.element_factory_make("playbin2", "video-source")
    sink = gst.element_factory_make("xvimagesink", "video-output")
    colorspace = gst.element_factory_make("ffmpegcolorspace")
    scale = gst.element_factory_make("videoscale")

    self.source.set_property("uri",\
    "http://10.10.25.4:12345/webcam.flv")

    caps = gst.Caps("video/x-raw-yuv, width=640, height=480, framerate=20/1")
    myfilter = gst.element_factory_make("capsfilter", "myfilter")
    myfilter.set_property("caps", caps)  # ################

    clr_sink = colorspace.get_pad("sink")
    self.source.connect("pad-added", self.on_pad_added, clr_sink)

    self.player.add(self.source, colorspace, scale, myfilter, sink)
    gst.element_link_many(colorspace, scale, myfilter, sink)

    self.bus = self.player.get_bus()
    self.bus.add_signal_watch()
    self.bus.connect('message', self.__on_message)

    self.player.set_state(gst.STATE_PLAYING)

【问题讨论】:

    标签: python video-streaming gstreamer


    【解决方案1】:

    如果可以使用 playbin2,则可以使用“convert-frame”动作信号。否则查看实现和重用。

    【讨论】:

    • 我在 playbin 对象中看到了 frame 属性...但我不知道如何向用户查看它。 :(
    • convert-frame 是一个动作信号。你会做 g_signal_emit_by_name 的python equiv(似乎是 gobject.GObject.emit() )。
    【解决方案2】:

    您想使用imagefreeze 元素。 类似:

    #!/usr/bin/python
    
    import pygst
    pygst.require("0.10")
    import gst
    
    player = gst.Pipeline("player")
    source = gst.element_factory_make("videotestsrc", "testsource")
    effect = gst.element_factory_make("clockoverlay", "clock")
    freeze = gst.element_factory_make("imagefreeze", "freeze")
    colorspace = gst.element_factory_make("ffmpegcolorspace", "colorspace")
    sink = gst.element_factory_make("ximagesink", "imagesink")
    
    player.add(source, effect, freeze, colorspace, sink)
    gst.element_link_many(source, effect, freeze, colorspace, sink)
    player.set_state(gst.STATE_PLAYING)
    
    while True:
      inp = raw_input("Press enter:")
      player.set_state(gst.STATE_READY)
      player.set_state(gst.STATE_PLAYING)
    

    每当您在控制台中点击“输入”时,都会拍摄新的屏幕截图(来自带有时钟覆盖的视频测试)并显示。

    【讨论】:

    • imagefreeze 将从单个图像创建视频流(将图像作为流重复)。 Imho Oleg 想要相反的结果 - 来自流的单个图像。
    • imagefreeze 将冻结任何进入的图像源,并重复冻结的图像。它可用于从静止图像创建视频流,但也可用于从“实时”视频流创建冻结视频流....至少我的示例冻结了 videotestsrc (+ clockoverlay) 和将重新冻结用户交互 - 我认为这是 OP 要求的
    • 它很有用,我真的很喜欢它......但问题是我需要从流中提取帧......初始模块将来自网络摄像头的视频写入磁盘,我有网络带按钮的界面...单击时,我需要向用户显示当前屏幕截图。所以,我正在尝试找到如何编写点击处理程序的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多