我使用跨平台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。
我真的坚持这个话题,所以如果有人有解决方案,那就太好了!
你实际上可以创建两个不同的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华硕笔记本电脑上成功测试(但以非常浅的方式)。