ekm*_*ngi 5 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.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)
Run Code Online (Sandbox Code Playgroud)
之后,我尝试通过总线创建一个信号来侦听来自源或接收器的任何消息,以指示已发送或接收新帧,以便可以保存它。
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message::any", self.save_file,"Save file")
Run Code Online (Sandbox Code Playgroud)
其中 save_file 是我的回调,我要在其中保存文件。
def save_file(self, bus, msg):
print "SAVED A NEW FILE"
Run Code Online (Sandbox Code Playgroud)
我有两个问题,
更新(2012 年 4 月 12 日):
几个链接供参考
v4l 的 python 接口。但它对我不起作用。当我尝试获取 12.04 Ubuntu 时,它似乎崩溃了。 http://code.google.com/p/python-video4linux2/
适合感兴趣的人的网络摄像头查看器代码。但这不是我想要的,因为它使用 gst-launch 并且不提供我想要的管道控制级别。http://pygstdocs.berlios.de/pygst-tutorial/webcam-viewer.html
Gstreamer 总线不适合用于此目的。放在那里的消息表示一些特殊事件,例如流结束、元素状态更改等。流经元素的缓冲区(图像)通常不会在总线上生成任何消息。
您可以考虑几种可能性:
您可能希望在附加接收器上将“sync”属性设置为 false(这会导致缓冲区尽快转储而不同步到时钟)。还可以考虑在 tee 之后添加一些队列(没有这种死锁可能会在就绪->暂停转换期间发生)。