4

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"

質問が 2 つあります。

  1. このコールバックを呼び出すにはどうすればよいですか。message::any が機能していません。
  2. このメッセージが呼び出されたとき、どうすればイメージ バッファにアクセスできますか。

更新 (2012 年 4 月 12 日):

参照用のリンクのカップル

  1. v4l 用の Python インターフェイス。しかし、それは私にとってはうまくいきませんでした。12.04 Ubuntu でグラブしようとするとクラッシュするようです。 http://code.google.com/p/python-video4linux2/

  2. 興味のある方のためのウェブカメラ ビューアー コード。しかし、これは gst-launch を使用し、必要なレベルのパイプライン制御を提供しないため、私が望むものではありません。http://pygstdocs.berlios.de/pygst-tutorial/webcam-viewer.html

4

2 に答える 2

2

Gstreamerバスは、この目的での使用を目的としたものではありません。そこに配置されたメッセージは、ストリームの終了、要素の状態の変化などの特別なイベントを通知します。通常、要素を流れるバッファ(画像)はバス上にメッセージを生成しません。

あなたはいくつかの可能性を考えるかもしれません:

  • videosinkの前に「tee」要素を作成し、videosinkと並列に「multifilesink」を接続します(pngencやjpegencなどの画像エンコーダーをいくつか見て、それらの1つをmultifilesinkの前に配置することをお勧めします)
  • 以前と同じですが、「appsink」を使用して、バッファーを処理し、バッファーでやりたいことを実行できるようにします。
  • ダンプのオンとオフを切り替えたい場合は、「バルブ」要素の使用を検討してください

追加のシンクで「sync」プロパティをfalseに設定することをお勧めします(これにより、クロックに同期せずにバッファができるだけ早くダンプされます)。ティーの後にいくつかのキューを追加することも検討してください(このデッドロックがないと、準備完了->一時停止の移行中に発生する可能性があります)。

于 2013-01-31T00:55:22.053 に答える
0

何年も経った後の私の回答があなたにとって役立つかどうかはわかりません. しかし、それが他の人にとって役立つことを願っています。

バッファを受信したというメッセージを受け取るには、gstreamerプローブを使用できます。

それは似たようなものかもしれません:

def make_pipeline(self):
    CLI2 = [
    'v4l2src ! video/x-raw,format=RGB,width=640,height=480,framerate=30/1 ! ',
    'videoconvert ! x264enc bitrate=128 ! mpegtsmux name="mux" ! hlssink name="sink"',
    ]
    gcmd = ''.join(CLI2)
    self.pipeline = Gst.parse_launch(gcmd)
    self.hlssink = self.pipeline.get_by_name("sink")
    self.hlssink.set_property("target-duration",2)
    self.hlssink_pad = self.hlssink.get_static_pad("sink")
    probe_id = self.hlssink_pad.add_probe(Gst.PadProbeType.EVENT_UPSTREAM,probe_callback)

そして、プローブ コールバック関数は次のようになります。

def probe_callback(hlssink_pad,info):
    info_event = info.get_event()
    info_structure = info_event.get_structure()
    do_something_with_this_info
    return Gst.PadProbeReturn.PASS

そのため、ソース パッドまたはシンク パッドでイベントが発生するたびに、プローブ コールバック関数がメイン スレッドで呼び出されます。

お役に立てれば!

于 2015-12-31T22:37:24.617 に答える