为一个QCamera安装两个QCameraViewFinder

时间:2018-03-05 11:33:58

标签: c++ qt qcamera

我使用跨平台Qt创建了一个应用,在此应用中,我需要在两个不同的屏幕上显示一个QCamera的结果。这涉及在同一QCameraViewFinder上链接两个QCamera

我的代码是:

QCameraViewFinder* viewfinder = new QCameraViewFinder(); 
QCamera* camera = new QCamera();
viewfinder->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
camera->setViewfinder(ui->viewfinder);
QCamera::CaptureModes captureMode =  QCamera::CaptureStillImage  ;
camera->setCaptureMode(captureMode);

这里的问题是我不能使用另一个QCameraViewFinder来跟踪我的QCamera。我需要这样做,因为我想在两个不同的屏幕上显示两个QCameraViewFinder。

我真的坚持这个话题,所以如果有人有解决方案,那就太棒了!

1 个答案:

答案 0 :(得分:2)

您实际上可以创建两个不同的QCamera实例,并为它们设置两个不同的取景器,但您将无法启动相机两次(即您最终会遇到某种繁忙的设备错误)。

如果您只需要一个简单的取景器实现,您可以通过信号子类化QAbstractVideoSurface并转发视频帧,这样:

<强> sharedviewfinder.h

#include <QAbstractVideoSurface>
#include <QPixmap>

class SharedViewfinder : public QAbstractVideoSurface
{
    Q_OBJECT
public:
    SharedViewfinder();

    QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const;
    bool present(const QVideoFrame &frame);

signals:
    void frameReady(QPixmap);
};

<强> sharedviewfinder.cpp

#include "sharedviewfinder.h"

SharedViewfinder::SharedViewfinder() : QAbstractVideoSurface(nullptr){}

QList<QVideoFrame::PixelFormat> SharedViewfinder::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
    QList<QVideoFrame::PixelFormat> list;
    if (handleType == QAbstractVideoBuffer::NoHandle)
    {
        list.append(QVideoFrame::Format_RGB32);
    }
    return list;
}

bool SharedViewfinder::present(const QVideoFrame &frame)
{
    QVideoFrame copy(frame);
    copy.map(QAbstractVideoBuffer::ReadOnly);
    QImage image(copy.bits(), copy.width(), copy.height(), copy.bytesPerLine(), QImage::Format_RGB32);
    copy.unmap();

    emit frameReady(QPixmap::fromImage(image));

    return true;
}

要显示转发的帧,请在您选择的小部件中设置QLabel和这样的插槽:

void Widget::frameReady(QPixmap pixmap)
{
    label->setPixmap(pixmap);
    label->update();
}

您现在可以将共享取景器设置为相机对象,并将其连接到多个视图:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    SharedViewfinder viewfinder;
    Widget mirror1;
    Widget mirror2;

    QObject::connect(&viewfinder, &SharedViewfinder::frameReady, &mirror1, &Widget::frameReady);
    QObject::connect(&viewfinder, &SharedViewfinder::frameReady, &mirror2, &Widget::frameReady);

    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    QCamera camera(cameras[0]);
    camera.setViewfinder(&viewfinder);

    mirror1.move(0, 0);
    mirror1.show();

    mirror2.move(1920, 0);
    mirror2.show();

    camera.start();

    return a.exec();
}

我希望这个开箱即用,无论如何你可能想要改变我设置为RGB32的颜色格式。另外,请注意我移动视图以在我拥有的两个屏幕上显示它们。我提供的示例代码已在Ubuntu 16.10华硕笔记本电脑上成功测试(但是以非常浅的方式)。