Python Gstreamer消息从视频源(网络摄像头)发出新帧信号

Python Gstreamer消息从视频源(网络摄像头)发出新帧信号,python,gstreamer,v4l2,Python,Gstreamer,V4l2,我正在尝试使用gstreamer将网络摄像头中的流保存为一系列图像。到目前为止,我已经编写了这段代码 #!/usr/bin/python import sys, os import pygtk, gtk, gobject import pygst pygst.require("0.10") import gst def __init__(self): #.... # Code to create a gtk Window #.... self

我正在尝试使用gstreamer将网络摄像头中的流保存为一系列图像。到目前为止,我已经编写了这段代码

#!/usr/bin/python
import sys, os
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst

 def __init__(self):
      #.... 
      # Code to create a gtk Window
      #....
      self.player = gst.Pipeline("player")
      source = gst.element_factory_make("v4l2src", "video-source")
      sink = gst.element_factory_make("xvimagesink", "video-output")
      caps = gst.Caps("video/x-raw-yuv, width=640, height=480")
      filter = gst.element_factory_make("capsfilter", "filter")
      filter.set_property("caps", caps)
      self.player.add(source, filter, sink)
      gst.element_link_many(source, filter, sink)
在此之后,我尝试通过总线创建一个信号,以侦听来自源或接收器的任何消息,以指示已发送或接收到新帧,从而可以保存它

      bus = self.player.get_bus()
      bus.add_signal_watch()
      bus.connect("message::any", self.save_file,"Save file")
其中save_file是我的回调,我想在这里保存文件

def save_file(self, bus, msg):
      print  "SAVED A NEW FILE"
我有两个问题

  • 如何调用此回调。消息::any不工作
  • 调用此消息时,如何访问图像缓冲区
  • 更新(4-12-2012):

    两个链接供参考

  • v4l的python接口。但这对我不起作用。当我尝试使用12.04 Ubuntu时,它似乎崩溃了。

  • 为感兴趣的人提供的网络摄像头查看器代码。但这不是我想要的,因为它使用gst启动,并且没有提供我想要的管道控制级别


  • Gstreamer总线不打算用于此目的。放在那个里的消息表示一些特殊事件,比如流结束、元素状态改变等等。流经元素的缓冲区(图像)通常不会在总线上生成任何消息

    你可以考虑几种可能性:

    • 将“tee”元素置于videosink之前,并将“multifilesink”与videosink并行连接(您可能希望看到一些图像编码器,如pngenc或jpegenc,并将其中一个放在multifilesink之前)
    • 像以前一样,但是使用“appsink”,它允许您处理缓冲区并对其执行任何操作
    • 如果您想切换倾销,请考虑使用“阀门”元素

    您可能希望在您的附加接收器上设置“同步”属性为false(这会导致缓冲区在不同步到时钟的情况下尽快被卸载)。考虑在TEE之后添加一些队列(如果在就绪-暂停过渡期间没有出现死锁).

    我不确定多年后我的回答是否对你有用。但希望它对其他人有用

    要接收已接收缓冲区的消息,可以使用gstreamer

    可能是类似的:

    def make_pipeline(self):
        CLI2 = [
        'v4l2src ! video/x-raw,format=RGB,width=640,height=480,framerate=30/1 ! ',
        'videoconvert ! x264enc bitrate=128 ! mpegtsmux name="mux" ! hlssink name="sink"',
        ]
        gcmd = ''.join(CLI2)
        self.pipeline = Gst.parse_launch(gcmd)
        self.hlssink = self.pipeline.get_by_name("sink")
        self.hlssink.set_property("target-duration",2)
        self.hlssink_pad = self.hlssink.get_static_pad("sink")
        probe_id = self.hlssink_pad.add_probe(Gst.PadProbeType.EVENT_UPSTREAM,probe_callback)
    
    然后,探测回调函数可以是:

    def probe_callback(hlssink_pad,info):
        info_event = info.get_event()
        info_structure = info_event.get_structure()
        do_something_with_this_info
        return Gst.PadProbeReturn.PASS
    
    因此,每当源板或接收器板上发生事件时,就会在主线程中调用探测回调函数

    希望这有帮助