如何使用 gst 和 pyqt 在 pyqt 小部件上流式传输视频
How to use gst along with pyqt to stream video on pyqt widget
我正在使用 gst 和我的 pyqt。我想在我的小部件中显示视频流。这样做时,我的应用程序开始流式传输视频,然后崩溃。我究竟做错了什么 ?
相机代码
from PyQt4 import QtCore
import gst
class camThread(QtCore.QThread):
updateImage = QtCore.pyqtSignal(str)
flag = None
def __init__(self,windowId):
QtCore.QThread.__init__(self)
self.windowId =windowId
self.player = gst.parse_launch("udpsrc port=5000 ! application/x-rtp, encoding-name=H264, payload=96 ! rtph264depay ! h264parse ! ffdec_h264 ! autovideosink")
bus = self.player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
bus.connect("sync-message::element", self.on_sync_message)
self.bus = bus
def on_sync_message(self, bus, message):
print "akash 123"
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 run(self):
print "akash"
self.player.set_state(gst.STATE_PLAYING)
msg = self.bus.timed_pop_filtered(gst.CLOCK_TIME_NONE,
gst.MESSAGE_ERROR | gst.MESSAGE_EOS)
self.flag = True
while(True):
if(self.flag==False):
break
def quit(self):
self.flag = false
self.player.set_state(gst.STATE_NULL)
#self.cap.release()
调用代码
def stopCam(self):
if(self.cam!=None):
self.cam.quit()
self.cam = None
def startCam(self):
if(self.cam==None):
self.cam = camThread(self.pic.winId())
self.cam.start()
elif(self.cam.isRunning()):
pass
我做错了什么?这是 paste bin
上的完整代码
PasteBin file 1
PasteBin file 2
编辑:
我在调试器中打开了 python。当我开始播放 gst 时,应用程序变为 unresponsive/fails,即在 gst 总线定时弹出后失败。
我看到的可能原因之一是与视频流相关的线程在应用程序中启动后停止或退出。之后应用程序进入 black/unresponsive/crashes。
我想你忘了初始化线程系统。
import gobject
gobject.threads_init()
import gst
您的 run()
函数也不需要 while 循环和标志 self.flag
。根据文档 here,对 timed_pop_filtered(gst.CLOCK_TIME_NONE, ...)
的调用将阻塞,直到它收到指定的消息。当您单击 "Stop Cam" 按钮时,您将终止播放。该标志从未使用过。
我还必须将 self.cam = camThread(self.pic.winId())
更改为 self.cam = camThread(int(self.pic.winId()))
并注释掉 imagesink.set_property("force-aspect-ratio", True)
-- 我正在使用 Mac OS X.
希望对您有所帮助。
我正在使用 gst 和我的 pyqt。我想在我的小部件中显示视频流。这样做时,我的应用程序开始流式传输视频,然后崩溃。我究竟做错了什么 ?
相机代码
from PyQt4 import QtCore
import gst
class camThread(QtCore.QThread):
updateImage = QtCore.pyqtSignal(str)
flag = None
def __init__(self,windowId):
QtCore.QThread.__init__(self)
self.windowId =windowId
self.player = gst.parse_launch("udpsrc port=5000 ! application/x-rtp, encoding-name=H264, payload=96 ! rtph264depay ! h264parse ! ffdec_h264 ! autovideosink")
bus = self.player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
bus.connect("sync-message::element", self.on_sync_message)
self.bus = bus
def on_sync_message(self, bus, message):
print "akash 123"
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 run(self):
print "akash"
self.player.set_state(gst.STATE_PLAYING)
msg = self.bus.timed_pop_filtered(gst.CLOCK_TIME_NONE,
gst.MESSAGE_ERROR | gst.MESSAGE_EOS)
self.flag = True
while(True):
if(self.flag==False):
break
def quit(self):
self.flag = false
self.player.set_state(gst.STATE_NULL)
#self.cap.release()
调用代码
def stopCam(self):
if(self.cam!=None):
self.cam.quit()
self.cam = None
def startCam(self):
if(self.cam==None):
self.cam = camThread(self.pic.winId())
self.cam.start()
elif(self.cam.isRunning()):
pass
我做错了什么?这是 paste bin
上的完整代码PasteBin file 1 PasteBin file 2
编辑:
我在调试器中打开了 python。当我开始播放 gst 时,应用程序变为 unresponsive/fails,即在 gst 总线定时弹出后失败。 我看到的可能原因之一是与视频流相关的线程在应用程序中启动后停止或退出。之后应用程序进入 black/unresponsive/crashes。
我想你忘了初始化线程系统。
import gobject
gobject.threads_init()
import gst
您的 run()
函数也不需要 while 循环和标志 self.flag
。根据文档 here,对 timed_pop_filtered(gst.CLOCK_TIME_NONE, ...)
的调用将阻塞,直到它收到指定的消息。当您单击 "Stop Cam" 按钮时,您将终止播放。该标志从未使用过。
我还必须将 self.cam = camThread(self.pic.winId())
更改为 self.cam = camThread(int(self.pic.winId()))
并注释掉 imagesink.set_property("force-aspect-ratio", True)
-- 我正在使用 Mac OS X.
希望对您有所帮助。