2015-04-01 104 views
0

我想將視頻從網絡攝像頭傳輸到使用PyQt5和Gstreamer製作的GUI。到目前爲止,我得到一個視頻與此代碼:PyQt5 + Gstreamer

import sys 
import gi 
gi.require_version('Gst', '1.0') 
from gi.repository import GObject, Gst 
GObject.threads_init() 
Gst.init(None) 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

class WebCam(QMainWindow): 
"""Form for Streaming a WebCam""" 
def __init__(self, parent = None): 
    super(WebCam, self).__init__(parent) 
    self.display = QWidget() 
    self.windowId = self.display.winId() 
    self.setGeometry(300,300,640,480) 
    self.setWindowTitle("WebCam Streaming") 

def setUpGst(self): 
    portUDP_RTP = 5800 
    self.WebCamPipe = Gst.Pipeline() # define the GStreamer Pipeline 
    self.UDP_RTP = Gst.ElementFactory.make('udpsrc', None) 
    self.UDP_RTP.set_property('port', portUDP_RTP) 
    self.WebCamPipe.add(self.UDP_RTP) # Add Elements to Pipeline 
    cameraCaps = Gst.Caps.from_string('application/x-rtp, encoding-name=JPEG,payload=26') 
    self.capsFilter = Gst.ElementFactory.make('capsfilter', None) 
    self.capsFilter.set_property('caps', cameraCaps)   
    self.WebCamPipe.add(self.capsFilter) # Add Elements to Pipeline 
    self.UDP_RTP.link(self.capsFilter) # Link Elements of Pipeline 
    self.rtpjpegdepay = Gst.ElementFactory.make('rtpjpegdepay', None) 
    self.WebCamPipe.add(self.rtpjpegdepay) # Add Elements to Pipeline 
    self.capsFilter.link(self.rtpjpegdepay) 
    self.jpegdec = Gst.ElementFactory.make('jpegdec', None) 
    self.WebCamPipe.add(self.jpegdec) 
    self.rtpjpegdepay.link(self.jpegdec)   
    self.autovideosink = Gst.ElementFactory.make('autovideosink', None) 
    self.WebCamPipe.add(self.autovideosink) 
    self.jpegdec.link(self.autovideosink) 
    bus = self.WebCamPipe.get_bus() 
    bus.add_signal_watch() 
    bus.enable_sync_message_emission() 
    bus.connect('sync-message::element', self.on_sync_message) 

def on_sync_message(self, bus, msg):   
    if msg.get_structure().get_name() == 'prepare-window-handle': 
     msg.src.set_window_handle(self.windowId)  

def startPrev(self): 
    self.WebCamPipe.set_state(Gst.State.PLAYING) 
    print("should be playing") 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    screen = WebCam() 
    screen.setUpGst() 
    screen.startPrev() 
    screen.show 
    sys.exit(app.exec_()) 

什麼,我需要的是讓覆蓋工作,所以它在我的GUI窗口小部件中顯示。我認爲這個問題是這部分代碼

bus.connect('sync-message::element', self.on_sync_message) 

它也給我這個錯誤消息:

Traceback (most recent call last): 
    File "WebCamWidget.py", line 66, in on_sync_message 
    msg.src.set_window_handle(self.windowId)  
AttributeError: '__main__.GstXvImageSink' object has no attribute 'set_window_handle' 

回答

0

我已經找到了解決方案,它是從gi.repository導入GstVideo中,代碼的正確的路線應該變成:

from gi.repository import GObject, Gst, GstVideo 

以獲取更多信息,您可以訪問這兩個環節:

1 - https://wiki.ubuntu.com/Novacut/GStreamer1.0#Using_GStreamer_1.0_from_Python

2 - http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/webcam-1.0

+0

特別是,如果你有多個.py文件,該GstVideo進口必須調用Gst.init()的文件中。 – 2016-09-22 00:16:51