2012-08-17 412 views
0

這是用於從服務器捕獲流式視頻的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) 

回答

0

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

0

如果你可以使用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