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),并显示在控制台“中输入”。
如果你可以使用playbin2,你可以使用“convert-frame”动作信号。否则看看执行和重用。
我在playbin对象中看到了frame属性...但我不知道如何查看它给用户。 :( – 2012-08-24 17:10:49
convert-frame是一个动作信号,你会做g_signal_emit_by_name的python equiv(好像是gobject.GObject.emit())。 – ensonic 2012-08-28 08:58:46
我会试试它,thanx))) – 2012-08-24 17:09:40
imagefreeze将会创建一个视频流一个图像(重复图像作为一个流)。 Imho Oleg希望获得相反的效果 - 来自流的单个图像。 – ensonic 2012-08-28 09:00:05
'imagefreeze'将冻结所有进入的图像源,并重复冻结的图像。它可以用来从静止图像创建一个视频流,但它也可以用来创建一个来自“现场”视频流的冻结视频流....至少我的例子冻结了“videotestsrc”(+'clockoverlay')和将重新冻结用户交互 - 我认为是OP请求 – 2012-08-28 11:11:17