我正在使用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的。