python – 从视频源(网络摄像头)发出新帧信号的Gstreamer消息
我正在尝试使用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,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不起作用. 更新(2012年4月12日): 几个链接供参考 > v4l的python接口.但它并没有为我工作.当我试图抓住12.04 Ubuntu时似乎崩溃了. 解决方法
Gstreamer Bus不适用于此目的.放在那里的消息相当于一些特殊事件,如流结束,元素状态改变等.通过元素的缓冲区(图像)通常不会在总线上生成任何消息.
您可以考虑几种可能性: >在videoink之前制作“tee”元素并将“multifilesink”与videosink并行连接(你可能想要看一些图像编码器,如pngenc或jpegenc,并在multifilesink之前放置其中一个) 您可能希望在附加接收器上将“sync”属性设置为false(这会导致缓冲区尽快转储而不同步到时钟).考虑在tee之后添加一些队列(在ready-gt; paused过渡期间不会发生这种死锁). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |