如何正确使用gstreamer appsink来处理网络摄像头流?

时间:2012-08-23 00:33:58

标签: python webcam gstreamer

我正在使用gstreamer和python访问一个类型为video / x-raw-rgb的usb网络摄像头流,分辨率为1280 x 960,这是我网络摄像头的原始分辨率。经过相当多的调查后,我的工作非常好,但最近系统更新似乎已经破坏了一些东西并且它停止了工作。

我有一个流类(它是http://pydoc.net/numm/0.1/numm.async的一个版本,带有一些扩展功能),我的管道的主要设置是这两种方法:

def _make_video_in_bin(self, src=None):
    if self.video_in_caps is None:
        self.video_in_caps = self.default_video_caps.copy()
    if self.video_in_size is not None:
        self.video_in_caps['width'] = self.video_in_size[0]
        self.video_in_caps['height'] = self.video_in_size[1]
    if self.video_framerate is not None:
        self.video_in_caps['framerate'] = self.video_framerate
    if src is None:
        src = gst.element_factory_make('autovideosrc')
    else:
        src = gst.element_factory_make(src)
    in_bin = gst.parse_bin_from_description('''
        jpegdec name=csp !
        ffmpegcolorspace !
        videoscale !
        capsfilter name=videocaps2 !
        appsink name=video_in emit-signals=true
        ''', False)
    in_bin.add(src)
    csp = in_bin.get_by_name('csp')
    src.link(csp)
    videofilter = in_bin.get_by_name('videocaps2')
    videofilter.props.caps = self._make_caps_from_dict(self.video_in_caps)
    return in_bin

def set_video_in(self, callback):
    self.video_in = callback
    in_bin = self.pipeline.get_by_name('video_in_bin')
    if in_bin is not None or callback is None:
        # XXX: Remove bin if callback is None.
        return
    in_bin = self._make_video_in_bin(self.video_src_spec)
    in_bin.props.name = 'video_in_bin'
    self.pipeline.add(in_bin)
    appsink = in_bin.get_by_name('video_in')
    appsink.connect('new-buffer', self._got_video_data)
    self._sync_state(in_bin)
    print 'did set video in'

第一种方法设置管道,第二种方法连接回调(我正在处理像素数据)。 这曾经在以下默认值下正常工作:

default_video_caps = dict(mimetype='video/x-raw-rgb', bpp=24, depth=24,
                  endianness=4321, red_mask=16711680, green_mask=65280,
                  blue_mask=255, framerate='30/1', width=1280, height=960)

我在Kubuntu Linux 12.04上使用了罗技C310网络摄像头。

因为我的系统更新,管道似乎仍然可以设置好,但我的回调从未被调用,所以没有任何反应。我在大约一个月前(节假日之前运行了系统更新,这就是为什么我之前没有发布),但是我找不到哪些库被更改以查看可能导致问题的原因。我运行gstreamer版本0.10-22-3,并且在过去10个月左右没有改变。

在guvcview中,相机工作没有任何问题。 如果我在终端中启动类似的流,它运行没有任何问题,如下所示:

    gst-launch autovideosrc ! jpegdec ! ffmpegcolorspace ! videoscale ! fpsdisplaysink sync=false

这让我觉得问题可能与appink有关。

我做错了什么,因为我的管道显然不会在系统更新后中断? 什么是适合我的流的适当管道?

感谢,

Joost的。

0 个答案:

没有答案