Python+;QT+;Gstreamer
我正在使用PyQt,并尝试从网络摄像头获取视频,以便在QT小部件中播放。我已经找到了C和Qt以及python和gtk的教程,但是对于pyQt和gstreamer的组合却没有找到。有人能让这个工作吗 这将在单独的窗口中播放视频:Python+;QT+;Gstreamer,python,pyqt4,gstreamer,maemo,qt-maemo,Python,Pyqt4,Gstreamer,Maemo,Qt Maemo,我正在使用PyQt,并尝试从网络摄像头获取视频,以便在QT小部件中播放。我已经找到了C和Qt以及python和gtk的教程,但是对于pyQt和gstreamer的组合却没有找到。有人能让这个工作吗 这将在单独的窗口中播放视频: self.gcam = gst.parse_launch('v4l2src device=/dev/video0 ! autovideosink') self.gcam.set_state(gst.STATE_PLAYING) 我需要的是让覆盖工作,以便它显示在我的GU
self.gcam = gst.parse_launch('v4l2src device=/dev/video0 ! autovideosink')
self.gcam.set_state(gst.STATE_PLAYING)
我需要的是让覆盖工作,以便它显示在我的GUI上的小部件中。谢谢,互联网大师
好的,我已经走得更远了,但仍然需要一些帮助。我实际上是为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是我试图在其中显示输出的小部件的窗口id。在N900上运行时,屏幕会变黑并闪烁。有什么想法吗?我要死在这里了
编辑:我被要求发布完整的代码,尽管我仍然需要清理一下,但以下是相关部分:
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)
这是拼凑的一些片段,我现在不能测试它,但也许它会对某人有所帮助。祝你好运 明白了!似乎我需要强制管道的分辨率与我将视频传输到的小部件的分辨率相匹配: self.fvidscale\u cap=gst.element\u factory\u make(“capsfilter”、“fvidscale\u cap”) self.fvidscale\u cap.set\u属性('caps',gst.caps\u from\u字符串('video/x-raw-yuv,width=256,height=192'))
然后,只需像其他元素一样将这些元素添加到管道中,就可以了。伙计,现在看起来很容易看,但当我头撞墙几天的时候,它就不那么明显了…Ptterb你能发布你的完整代码吗 我复制了你的代码。
将fvidscale_帽添加到管道,包括:
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,并将其winId()传递给Vid构造函数。小部件开始加载,但崩溃 输出显示:
应该正在播放
分段错误如果在Linux以外的平台上使用PySide而不是PyQt,winId()将返回一个PyCObject,该PyCObject。在我的例子中,在Microsoft Windows上将GStreamer(pygst)与PySide一起使用时,这很方便:
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)
粘贴的代码未显示gobject加载,无法取消。 我花了很长时间才弄清楚丢失了什么。谢谢你的邀请 工作音频示例
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_())
你在哪里找到C++和QT?IM寻找方式流QSTAR搜索这个网站和谷歌我找到了信息C++和QT。另外,请查看Maemo.org论坛。祝你好运代码中的问题似乎是缩进问题。你的函数startPrev和pausePrev都是空的,就像你已经发布了它们一样,试试我刚刚发布的新代码。如果你还有问题,请告诉我@伯纳德:不,对不起。当诺基亚决定放弃这个项目,转而使用Windows时,我放弃了这个项目