我想在Pyside2(5.12.2)/ QML应用程序中使用视频滤镜来进一步处理相机的帧。我将示例从the QT docs转换为Python,但不是执行QVideoFilterRunnable的“run()”方法,而是无休止地调用构造函数,从而创建一个又一个新实例。我怀疑这可能与Python的垃圾收集有关 - 有谁知道如何在PySide2中执行run()方法?
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”。
在Python中你必须明确进行继承,为此你必须使用super(),在你的情况下,Qt检测到MyFilterRunnable不是QVideoFilterRunnable,所以它试图找到另一个过滤器,MyVideoFilter将相同的过滤器传递给它,所以你看到每时每刻都会打印出“init”。另外,什么是过滤器?我们不知道,没有必要,因为没有必要添加参数作为参数,我们可以省略__init__
:
class MyFilterRunnable(QVideoFilterRunnable):
def run(self, _input, surface, flags):
print("run")
return _input
即使考虑到上述不幸,你的程序也会因为一个未解决的bug而崩溃:PYSIDE-785。在PyQt5中也是如此。