为什么我的PySide2中QVideoFilterRunnable的“run()”方法没有被执行?

2024-03-28 21:08:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在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
        }
    }
}

在控制台中,我看到的不是“run”,而是无数的“init”。你知道吗


Tags: runfromimportselfidappinitdef
1条回答
网友
1楼 · 发布于 2024-03-28 21:08:56

在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中。你知道吗

相关问题 更多 >