2010-03-08 13 views
6

मैं पीईक्यूटी के साथ काम कर रहा हूं और एक क्यूटी विजेट के भीतर खेलने के लिए वेबकैम से वीडियो प्राप्त करने की कोशिश कर रहा हूं। मुझे सी और क्यूटी के लिए ट्यूटोरियल मिले हैं, और पायथन और gtk के लिए, लेकिन pyQt और gstreamer के इस कॉम्बो के लिए कुछ भी नहीं है। किसी को यह काम मिल रहा है?पायथन + क्यूटी + जीस्ट्रीमर

यह वीडियो ठीक खेलता है, लेकिन एक अलग विंडो में:

self.gcam = gst.parse_launch('v4l2src device=/dev/video0 ! autovideosink') 
self.gcam.set_state(gst.STATE_PLAYING) 

है कि मैं क्या जरूरत है ओवरले इतना काम कर रहे यह मेरी जीयूआई पर एक विजेट के भीतर प्रदर्शित किया जाता है पाने के लिए है। धन्यवाद, इंटरनेट का गुरु!

ठीक है, तो मुझे बहुत दूर मिल गया है, लेकिन अभी भी कुछ मदद की ज़रूरत है। मैं वास्तव में Maemo के लिए इस लिख रहा हूँ, लेकिन निम्नलिखित कोड मेरे linux लैपटॉप पर ठीक काम करता है:

class Vid: 
    def __init__(self, windowId): 
    self.player = gst.Pipeline("player") 
    self.source = gst.element_factory_make("v4l2src", "vsource") 
    self.sink = gst.element_factory_make("autovideosink", "outsink") 
    self.source.set_property("device", "/dev/video0") 
    self.scaler = gst.element_factory_make("videoscale", "vscale") 
    self.window_id = None 
    self.windowId = windowId 

    self.player.add(self.source, self.scaler, self.sink) 
    gst.element_link_many(self.source,self.scaler, self.sink) 

    bus = self.player.get_bus() 
    bus.add_signal_watch() 
    bus.enable_sync_message_emission() 
    bus.connect("message", self.on_message) 
    bus.connect("sync-message::element", self.on_sync_message) 

    def on_message(self, bus, message): 
    t = message.type 
    if t == gst.MESSAGE_EOS: 
     self.player.set_state(gst.STATE_NULL) 
    elif t == gst.MESSAGE_ERROR: 
     err, debug = message.parse_error() 
     print "Error: %s" % err, debug 
     self.player.set_state(gst.STATE_NULL) 

    def on_sync_message(self, bus, message): 
    if message.structure is None: 
     return 
    message_name = message.structure.get_name() 
    if message_name == "prepare-xwindow-id": 
     win_id = self.windowId 
     assert win_id 
     imagesink = message.src 
     imagesink.set_property("force-aspect-ratio", True) 
     imagesink.set_xwindow_id(win_id) 
    def startPrev(self): 
    self.player.set_state(gst.STATE_PLAYING) 
    print "should be playing" 
vidStream = Vid(wId) 
vidStream.startPrev() 

जहां wid विजेट im में उत्पादन प्रदर्शित करने के लिए प्राप्त करने की कोशिश की खिड़की आईडी है जब मैं इस चलाते हैं। एन 9 00 पर, स्क्रीन काले और ब्लिंक हो जाती है। कोई विचार? मैं यहाँ मर रहा हूँ!

संपादित करें: मैं पूर्ण कोड पोस्ट करने के लिए कहा गया है, और हालांकि मैं अभी भी यह थोड़ा साफ करने के लिए की जरूरत है, यहाँ प्रासंगिक हिस्सा है:,

self.cameraWindow = QtGui.QWidget(self) 
self.cameraWindow.setGeometry(QtCore.QRect(530, 20, 256, 192)) 
self.cameraWindow.setObjectName("cameraWindow") 
self.cameraWindow.setAttribute(0, 1); # AA_ImmediateWidgetCreation == 0 
self.cameraWindow.setAttribute(3, 1); # AA_NativeWindow == 3 

global wId 
wId = self.cameraWindow.winId() 

self.camera = Vid(wId) 

self.camera.startPrev() 

class Vid: 
    def __init__(self, windowId): 
    self.player = gst.Pipeline("player") 
    self.source = gst.element_factory_make("v4l2src", "vsource") 
    self.sink = gst.element_factory_make("autovideosink", "outsink") 
    self.source.set_property("device", "/dev/video0") 
    #self.scaler = gst.element_factory_make("videoscale", "vscale") 
    self.fvidscale = gst.element_factory_make("videoscale", "fvidscale") 
    self.fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap") 
    self.fvidscale_cap.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=256, height=192')) 
    self.window_id = None 
    self.windowId = windowId 
    print windowId 

    self.player.add(self.source, self.fvidscale, self.fvidscale_cap, self.sink) 
    gst.element_link_many(self.source,self.fvidscale, self.fvidscale_cap, self.sink) 

    bus = self.player.get_bus() 
    bus.add_signal_watch() 
    bus.enable_sync_message_emission() 
    bus.connect("message", self.on_message) 
    bus.connect("sync-message::element", self.on_sync_message) 

    def on_message(self, bus, message): 
    t = message.type 
    if t == gst.MESSAGE_EOS: 
     self.player.set_state(gst.STATE_NULL) 
    elif t == gst.MESSAGE_ERROR: 
     err, debug = message.parse_error() 
     print "Error: %s" % err, debug 
     self.player.set_state(gst.STATE_NULL) 

    def on_sync_message(self, bus, message): 
    if message.structure is None: 
     return 
    message_name = message.structure.get_name() 
    if message_name == "prepare-xwindow-id": 
     win_id = self.windowId 
     assert win_id 
     imagesink = message.src 
     imagesink.set_property("force-aspect-ratio", True) 
     imagesink.set_xwindow_id(win_id) 
    def startPrev(self): 
    self.player.set_state(gst.STATE_PLAYING) 
    def pausePrev(self): 
    self.player.set_state(gst.STATE_NULL) 

यह एक साथ कुछ बिट्स piecing जाता है और मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन शायद यह किसी के लिए सहायक होगा। सौभाग्य!

+0

आपने सी ++ और क्यूटी के लिए कहां पाया? मैं क्यूटी – user63898

+0

के साथ आरएसटी स्ट्रीम करने के लिए रास्ता तलाश रहा हूं बस इस साइट को खोज रहा हूं और Google मुझे सी ++ और क्यूटी के लिए जानकारी मिली। इसके अलावा, Maemo.org मंचों की जांच करें। सौभाग्य! – Ptterb

उत्तर

1

समझ गया! ऐसा प्रतीत होता है मैं विजेट जहाँ मैं करने के लिए वीडियो पंप था के संकल्प मैच के लिए पाइप लाइन के संकल्प के लिए मजबूर करने की जरूरत:

self.fvidscale_cap = gst.element_factory_make ("capsfilter", "fvidscale_cap") self.fvidscale_cap .set_property ('कैप्स', gst.caps_from_string ('वीडियो/एक्स-कच्चा-युव, चौड़ाई = 256, ऊंचाई = 1 9 2'))

फिर उनको अन्य तत्वों की तरह पाइपलाइन में जोड़ें, और यह बहुत अच्छा काम करता है । मैन, अब यह बहुत आसान लग रहा है, लेकिन जब मैं कुछ दिनों के लिए दीवार के खिलाफ अपने सिर को तेज़ कर रहा था तो यह इतना स्पष्ट नहीं था ...

1

Ptterb क्या आप अपना पूरा कोड कृपया पोस्ट कर सकते हैं?

मैंने आपका कोड कॉपी किया।
जोड़ा गया पाइपलाइन को fvidscale_cap साथ,: मुख्य कार्यक्रम से

self.player.add(self.source, self.scaler, self.fvidscale_cap, self.sink) 
gst.element_link_many(self.source,self.scaler, self.fvidscale_cap, self.sink) 

मैं एक नया QWidget बनाते हैं, और Vid निर्माता करने के लिए अपने winId() गुजरती हैं।
विजेट लोड हो रहा है, लेकिन दुर्घटनाग्रस्त हो जाता है।

उत्पादन का कहना है:

विभाजन गलती

+0

मैंने जो नया कोड डाला है उसे आजमाएं। अगर आपको अभी भी समस्याएं आ रही हैं तो मुझे बताएं! – Ptterb

+0

ज़ोलाकट, क्या आपने ऊपर की समस्या हल की है? –

+0

@ बर्नार्डोकिओटोकू: नहीं, क्षमा करें। मैंने उस परियोजना को छोड़ दिया जब नोकिया ने बकवास करने और विंडोज़ पर स्विच करने का फैसला किया – ZolaKt

3

आप एक मंच लिनक्स, winId (अलावा अन्य पर PyQt के बजाय PySide उपयोग करने के लिए हो रहा हो, तो) खेलने जाना चाहिए देता है एक PyCObject जो can't be used directly with native functions or other modules

from ctypes import pythonapi, c_void_p, py_object 
... 
if message_name == 'prepare-xwindow-id': 
    # convert winId from PyCObject to void pointer 
    pythonapi.PyCObject_AsVoidPtr.restype = c_void_p 
    pythonapi.PyCObject_AsVoidPtr.argtypes = [py_object] 
    hWnd = pythonapi.PyCObject_AsVoidPtr(self.videoWidget.winId()) 

    # set window handle to video sink 
    self.videoSink.set_xwindow_id(hWnd) 
1

चिपकाया कोड नहीं दिखा रहा है gobject लोड हो रहा है, जो खारिज नहीं किया जा सकता है: मेरे मामले में यह जब GStreamer (pygst) माइक्रोसॉफ्ट विंडोज पर PySide साथ का उपयोग कर काम में आया था। यह पता लगाने के लिए मुझे एक अच्छा लगा कि क्या गुम था। एक काम करने वाला ऑडियो उदाहरण रखने के लिए धन्यवाद।

import gobject, pygst 
pygst.require('0.10') 
import gst 
from PyQt4.QtGui import QMainWindow, QWidget, QApplication 
import sys 

class Video(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 
     container = QWidget() 
     self.setCentralWidget(container) 
     self.windowId = container.winId() 
     self.setGeometry(300,300,640,480) 
     self.show() 

    def setUpGst(self): 
     self.player = gst.Pipeline("player") 
     source = gst.element_factory_make("v4l2src", "vsource") 
     sink = gst.element_factory_make("xvimagesink", "sink") 
     fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap") 
     fvidscale = gst.element_factory_make("videoscale", "fvidscale") 
     caps = gst.caps_from_string('video/x-raw-yuv') 
     fvidscale_cap.set_property('caps', caps) 
     source.set_property("device", "/dev/video0") 

     self.player.add(source, fvidscale, fvidscale_cap, sink) 
     gst.element_link_many(source,fvidscale, fvidscale_cap, sink) 
     bus = self.player.get_bus() 
     bus.add_signal_watch() 
     bus.enable_sync_message_emission() 
     bus.connect("message", self.on_message) 
     bus.connect("sync-message::element", self.on_sync_message) 

    def on_message(self, bus, message): 
     t = message.type 
     if t == gst.MESSAGE_EOS: 
      self.player.set_state(gst.STATE_NULL) 
      print "end of message" 
     elif t == gst.MESSAGE_ERROR: 
      err, debug = message.parse_error() 
      print "Error: %s" % err, debug 
      self.player.set_state(gst.STATE_NULL) 

    def on_sync_message(self, bus, message): 
     if message.structure is None: 
      return 
     message_name = message.structure.get_name() 
     if message_name == "prepare-xwindow-id": 
      win_id = self.windowId 
      assert win_id 
      imagesink = message.src 
      imagesink.set_xwindow_id(win_id) 

    def startPrev(self): 
     self.player.set_state(gst.STATE_PLAYING) 
     print "should be playing" 

if __name__ == "__main__": 
    gobject.threads_init() 
    app = QApplication(sys.argv) 
    video = Video() 
    video.setUpGst() 
    video.startPrev() 
    sys.exit(app.exec_()) 
संबंधित मुद्दे