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