GStreamer如何从流中提取视频帧?

问题描述:

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

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) 

要使用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) 

,只要你打一个新的截图将采取(从videotest与clockoverlay),并显示在控制台“中输入”。

+0

我会试试它,thanx))) – 2012-08-24 17:09:40

+0

imagefreeze将会创建一个视频流一个图像(重复图像作为一个流)。 Imho Oleg希望获得相反的效果 - 来自流的单个图像。 – ensonic 2012-08-28 09:00:05

+0

'imagefreeze'将冻结所有进入的图像源,并重复冻结的图像。它可以用来从静止图像创建一个视频流,但它也可以用来创建一个来自“现场”视频流的冻结视频流....至少我的例子冻结了“videotestsrc”(+'clockoverlay')和将重新冻结用户交互 - 我认为是OP请求 – 2012-08-28 11:11:17

如果你可以使用playbin2,你可以使用“convert-frame”动作信号。否则看看执行和重用。

+0

我在playbin对象中看到了frame属性...但我不知道如何查看它给用户。 :( – 2012-08-24 17:10:49

+0

convert-frame是一个动作信号,你会做g_signal_emit_by_name的python equiv(好像是gobject.GObject.emit())。 – ensonic 2012-08-28 08:58:46