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

2023-12-21

我正在尝试使用 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"

我有两个问题,

  1. 我如何调用这个回调。消息::any 不起作用。
  2. 当调用此消息时,如何访问图像缓冲区。

更新(2012 年 4 月 12 日):

几个链接供参考

  1. v4l 的 python 接口。但它对我不起作用。当我尝试获取 12.04 Ubuntu 时,它似乎崩溃了。http://code.google.com/p/python-video4linux2/ http://code.google.com/p/python-video4linux2/

  2. 适合感兴趣的人的网络摄像头查看器代码。但这不是我想要的,因为它使用 gst-launch 并且不提供我想要的管道控制级别。http://pygstdocs.berlios.de/pygst-tutorial/webcam-viewer.html http://pygstdocs.berlios.de/pygst-tutorial/webcam-viewer.html


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

您可以考虑几种可能性:

  • 在videosink之前制作“tee”元素,并将“multifilesink”并行连接到videosink(您可能希望看到一些图像编码器,如pngenc或jpegenc,并将其中之一放在multifilesink之前”)
  • 像以前一样,但是使用“appsink”,它允许您处理缓冲区并用它们做任何您想做的事情
  • 如果您想打开和关闭转储,请考虑使用“valve”元素

您可能希望在附加接收器上将“sync”属性设置为 false(这会导致缓冲区尽快转储而不同步到时钟)。还可以考虑在 tee 之后添加一些队列(没有这种死锁可能会在就绪->暂停转换期间发生)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于从视频源(网络摄像头)发出新帧信号的 Gstreamer 消息 的相关文章

随机推荐