是否可以使用一个MediaPlayer控制多个VideoWidgets?

时间:2015-02-11 17:27:45

标签: qt qt5 qmediaplayer

我想知道是否可以同时在3个小部件中使用Qt5 QtMultimedia库播放视频。

我有一个视频,我想在3个小部件中显示:一个显示完整视频,另一个关注视频中移动的某个对象,最后一个再次关注其他对象。

我现在一直苦苦挣扎,我开始怀疑我的努力是否值得......

有没有人尝试类似的东西和/或可以给我一些如何解决这个问题的技巧?

1 个答案:

答案 0 :(得分:1)

在多个小部件中显示视频的一种方法是使用自定义视频表面类,并使用它们为您生成QImage系列,并按照您喜欢的方式处理/显示这些图像。

自定义视频表面的示例:

/* Here is our custom video surface, */
class VideoSurface : public QAbstractVideoSurface
{
    Q_OBJECT
public:
    VideoSurface(QObject *parent = 0) : QAbstractVideoSurface(parent)
    {
    }

    QList<QVideoFrame::PixelFormat>
    supportedPixelFormats(QAbstractVideoBuffer::HandleType) const
    {
        return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32;
    }

    /* this will get the QVideoFrame and convert to QImage. */
    bool present(const QVideoFrame& frame)
    {
        if (frame.isValid())
        {
            QVideoFrame cloneFrame(frame);
            cloneFrame.map(QAbstractVideoBuffer::ReadOnly);
            const QImage img = QImage(cloneFrame.bits(),
                                      cloneFrame.width(),
                                      cloneFrame.height(),
                                      QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat()));

            cloneFrame.unmap();

            emit readyRead(img);

            return true;
        }
        return false;
    }

signals:
    void readyRead(QImage);
};

这里有一个示例项目:

Double View project

截图:

Double View

希望有所帮助!