我想在Pyside2(5.12.2)/ QML应用程序中使用视频滤镜以进一步处理相机的帧。我将示例从the QT docs转换为Python,但是没有执行QVideoFilterRunnable的“ run()”方法,而是无休止地调用了构造函数,从而创建了一个新的实例。我怀疑这可能与Python的垃圾回收有关-有人知道如何使run()方法在PySide2中执行吗?
import sys
from PySide2.QtCore import QUrl, Slot, Signal, Property
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide2.QtMultimedia import QVideoFilterRunnable, QAbstractVideoFilter
class MyFilterRunnable(QVideoFilterRunnable):
def __init__(self, filter):
print("init")
self.init = False
self.filter = filter
def run(self, input, surface, flags):
print("run")
return input
class MyVideoFilter(QAbstractVideoFilter):
def createFilterRunnable(self):
return MyFilterRunnable(self)
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
qmlRegisterType(MyVideoFilter, "my.uri", 1, 0, "MyVideoFilter");
engine.load(QUrl.fromLocalFile('qml_test.qml'))
sys.exit(app.exec_())
QML文件:
import QtQuick 2.0
import QtMultimedia 5.4
import QtQuick 2.10
import QtQuick.Controls 2.1
import QtQuick.Window 2.2
import my.uri 1.0
ApplicationWindow {
id: app
width: 640
height: 480
visible: true
Rectangle {
id : cameraUI
anchors.fill: parent
Camera {
id: camera
}
MyVideoFilter {
id: myvideofilter
}
VideoOutput {
id: viewfinder
filters: [ myvideofilter ]
source: camera
}
}
}
在控制台中,我看到了无数的“ init”,而不是“ run”。
答案 0 :(得分:0)
在Python中,在进行继承时必须明确,为此必须使用super(),在这种情况下,Qt检测到MyFilterRunnable不是QVideoFilterRunnable,因此它尝试查找另一个过滤器,而MyVideoFilter将相同的过滤器传递给它使您随时都看到“ init”字样的打印。另外,什么是过滤器?我们不知道,这是没有必要的,并且由于没有必要添加参数作为参数,我们可以省略__init__
:
class MyFilterRunnable(QVideoFilterRunnable):
def run(self, _input, surface, flags):
print("run")
return _input
不幸的是,即使考虑了上述情况,您的程序也会由于未解决的错误PYSIDE-785而崩溃。在PyQt5中也是如此。