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'
特别是,如果你有多个.py文件,该GstVideo进口必须调用Gst.init()的文件中。 – 2016-09-22 00:16:51