Maybe a bug on PySide2, QCamera, QAbstractVideoSurface

227 views Asked by At

I want to capture image from camera.I got a way to do it.But it works on PyQt5 successfully.failed on PySide2.

Here's the PySide2 code

import sys  
from PySide2.QtWidgets import QWidget, QApplication  
from PySide2.QtMultimedia import QCamera, QAbstractVideoSurface, QVideoSurfaceFormat, QVideoFrame

class CameraFrameGrabber(QAbstractVideoSurface):
    def __init__(self, parent=None):
        super(CameraFrameGrabber, self).__init__(parent)
        print('init')

    def supportedPixelFormats(self, type):
        print("supportedPixelFormats() called")
        print("supportedPixelFormats() finished")
        return [QVideoFrame.Format_ARGB32, QVideoFrame.Format_ARGB32_Premultiplied,
                QVideoFrame.Format_RGB32, QVideoFrame.Format_RGB24, QVideoFrame.Format_RGB565,
                QVideoFrame.Format_RGB555, QVideoFrame.Format_ARGB8565_Premultiplied,
                QVideoFrame.Format_BGRA32, QVideoFrame.Format_BGRA32_Premultiplied, QVideoFrame.Format_BGR32,
                QVideoFrame.Format_BGR24, QVideoFrame.Format_BGR565, QVideoFrame.Format_BGR555,
                QVideoFrame.Format_BGRA5658_Premultiplied, QVideoFrame.Format_AYUV444,
                QVideoFrame.Format_AYUV444_Premultiplied, QVideoFrame.Format_YUV444,
                QVideoFrame.Format_YUV420P, QVideoFrame.Format_YV12, QVideoFrame.Format_UYVY,
                QVideoFrame.Format_YUYV, QVideoFrame.Format_NV12, QVideoFrame.Format_NV21,
                QVideoFrame.Format_IMC1, QVideoFrame.Format_IMC2, QVideoFrame.Format_IMC3,
                QVideoFrame.Format_IMC4, QVideoFrame.Format_Y8, QVideoFrame.Format_Y16,
                QVideoFrame.Format_Jpeg, QVideoFrame.Format_CameraRaw, QVideoFrame.Format_AdobeDng]

    # def isFormatSupported(self, format):
    #     print("isFormatSupported() called")

    # def start(self, format):
    #     print("start() called")

    def present(self, frame):
        print('call present')
        print(frame)
        return True

    # def stop(self):
    #     print("stop() called")
  
if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    w = QWidget()  
    w.show()  
    w.setWindowTitle("Hello PyQt5")  
    the_camera = QCamera()
    the_grabber = CameraFrameGrabber()
    the_camera.setViewfinder(the_grabber)
    the_camera.start()
    sys.exit(app.exec_())  

Here's the PyQt5 code

import sys  
from PyQt5.QtWidgets import QWidget, QApplication  
from PyQt5.QtMultimedia import QCamera, QAbstractVideoSurface, QVideoSurfaceFormat, QVideoFrame

class CameraFrameGrabber(QAbstractVideoSurface):
    def __init__(self, parent=None):
        super(CameraFrameGrabber, self).__init__(parent)
        print('init')

    def supportedPixelFormats(self, type):
        print("supportedPixelFormats() called")
        print("supportedPixelFormats() finished")
        return [QVideoFrame.Format_ARGB32, QVideoFrame.Format_ARGB32_Premultiplied,
                QVideoFrame.Format_RGB32, QVideoFrame.Format_RGB24, QVideoFrame.Format_RGB565,
                QVideoFrame.Format_RGB555, QVideoFrame.Format_ARGB8565_Premultiplied,
                QVideoFrame.Format_BGRA32, QVideoFrame.Format_BGRA32_Premultiplied, QVideoFrame.Format_BGR32,
                QVideoFrame.Format_BGR24, QVideoFrame.Format_BGR565, QVideoFrame.Format_BGR555,
                QVideoFrame.Format_BGRA5658_Premultiplied, QVideoFrame.Format_AYUV444,
                QVideoFrame.Format_AYUV444_Premultiplied, QVideoFrame.Format_YUV444,
                QVideoFrame.Format_YUV420P, QVideoFrame.Format_YV12, QVideoFrame.Format_UYVY,
                QVideoFrame.Format_YUYV, QVideoFrame.Format_NV12, QVideoFrame.Format_NV21,
                QVideoFrame.Format_IMC1, QVideoFrame.Format_IMC2, QVideoFrame.Format_IMC3,
                QVideoFrame.Format_IMC4, QVideoFrame.Format_Y8, QVideoFrame.Format_Y16,
                QVideoFrame.Format_Jpeg, QVideoFrame.Format_CameraRaw, QVideoFrame.Format_AdobeDng]

    # def isFormatSupported(self, format):
    #     print("isFormatSupported() called")

    # def start(self, format):
    #     print("start() called")

    def present(self, frame):
        print('call present')
        print(frame)
        return True

    # def stop(self):
    #     print("stop() called")
  
if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    w = QWidget()  
    w.show()  
    w.setWindowTitle("Hello PyQt5")  
    the_camera = QCamera()
    the_grabber = CameraFrameGrabber()
    the_camera.setViewfinder(the_grabber)
    the_camera.start()
    sys.exit(app.exec_())  

Both code run successfully.

present function called in PyQt5, not called in PySide2.

Is there any difference between the usage of PySide2 and PyQt5.

Who can tell me why it seem like this?Thanks.

0

There are 0 answers