基本思路是在C++代码中处理后端逻辑,qml负责前端显示。
QuickUsbCamera.h文件
#ifndef _QUICK_USB_CAMERA_H_
#define _QUICK_USB_CAMERA_H_
#include <QCamera>
#include <QMediaCaptureSession>
#include <QMediaDevices>
#include <qqml.h>
class QuickUsbCamera : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(QuickUsbCamera);
Q_PROPERTY(QObject *videoOutput READ getVideoOutput WRITE setVideoOutput NOTIFY videoOutputChanged);
Q_PROPERTY(bool isCameraAvailable READ getIsCameraAvailable NOTIFY isCameraAvailableChanged);
QML_ELEMENT
signals:
void videoOutputChanged(QObject *);
void isCameraAvailableChanged(bool);
public:
QuickUsbCamera(QObject *parent = nullptr);
~QuickUsbCamera();
public slots:
bool setVideoOutput(QObject *videoOutput);
QObject *getVideoOutput();
bool getIsCameraAvailable();
private slots:
void initCamera();
private:
QCamera *m_camera{nullptr};
QMediaCaptureSession *m_captureSession{nullptr};
QMediaDevices *m_mediaDevices{nullptr};
bool m_isCameraAvailable{false};
};
#endif //_QUICK_USB_CAMERA_H_
QuickUsbCamera.cpp文件
#include "QuickUsbCamera.h"
#include <QVideoFrame>
#include <QVideoSink>
QuickUsbCamera::QuickUsbCamera(QObject *parent)
: QObject(parent),
m_mediaDevices(new QMediaDevices()),
m_captureSession(new QMediaCaptureSession())
{
QObject::connect(m_mediaDevices, &QMediaDevices::videoInputsChanged, this, &QuickUsbCamera::initCamera);
this->initCamera();
}
QuickUsbCamera::~QuickUsbCamera()
{
delete m_mediaDevices;
delete m_captureSession;
}
bool QuickUsbCamera::setVideoOutput(QObject *videoOutput)
{
m_captureSession->setVideoOutput(videoOutput);
emit videoOutputChanged(videoOutput);
return true;
}
QObject *QuickUsbCamera::getVideoOutput()
{
return m_captureSession->videoOutput();
}
bool QuickUsbCamera::getIsCameraAvailable()
{
return m_isCameraAvailable;
}
void QuickUsbCamera::initCamera()
{
if (nullptr != m_captureSession->videoOutput()) {
auto videoSink = m_captureSession->videoOutput()->property("videoSink").value<QVideoSink *>();
if (nullptr != videoSink) {
videoSink->setVideoFrame(QVideoFrame());
}
}
auto videoInputs = m_mediaDevices->videoInputs();
m_isCameraAvailable = false;
for (auto it : videoInputs) {
if (it.id().contains("usb")) {
m_camera = new QCamera(it);
m_captureSession->setCamera(m_camera);
m_camera->setActive(true);
m_isCameraAvailable = true;
break;
}
}
emit this->isCameraAvailableChanged(m_isCameraAvailable);
}
Main.qml文件
import QtQuick
import QtQuick.Window
import QtMultimedia
import TestQt_6_5_Camera
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: usbCamera
anchors.centerIn: parent
color: "black"
QuickUsbCamera{
id: camera
videoOutput: videoOutput
}
VideoOutput {
id: videoOutput
anchors.fill: parent
}
Text{
anchors.centerIn: parent
text: "USB Camera is unavailable"
color: "white"
font.family: "Arial"
font.pixelSize: 32
visible: {
return !camera.isCameraAvailable}
}
}
}