相机示例

演示如何捕捉静态图像或录制视频。

相机示例演示如何使用 Qt Multimedia实现一些基本的相机功能,以拍摄静态图像和录制带音频的视频片段。

运行示例

运行示例 Qt Creator,打开Welcome 模式,然后从Examples 中选择示例。更多信息,请参阅Qt Creator: 教程:构建并运行

该示例实现了一个Camera 类,作为我们的摄像机接口。该类具有用户界面、控制功能、设置值以及定义图像或视频片段保存位置的方法。它还将存储图像和视频设置。

相机类使用

  • QCamera 的实例,这是硬件的 API 类接口。
  • QImageCapture 的一个实例,用于拍摄静态图像。
  • QMediaRecorder 的一个实例,用于录制视频。它还包含用户界面对象。

相机构造函数

摄像机构造函数对用户界面进行一些基本的初始化,包括默认禁用所有按钮。

Camera::Camera() : ui(new Ui::Camera)
{
    ui->setupUi(this);
    // disable all buttons by default
    updateCameraActive(false);
    readyForCapture(false);
    ui->recordButton->setEnabled(false);
    ui->pauseButton->setEnabled(false);
    ui->stopButton->setEnabled(false);
    ui->metaDataButton->setEnabled(false);

它还会寻求输入设备访问权限:

#if QT_CONFIG(permissions) // 摄像头   QCameraPermissioncameraPermission;switch(qApp->checkPermission(cameraPermission)) {caseQt::PermissionStatus::Undetermined:        qApp->requestPermission(cameraPermission, this, &Camera::init);
       return;caseQt::PermissionStatus::Denied        qWarning("Camera permission is not granted!");
       return;caseQt::PermissionStatus::Granted: break; }// microphone   QMicrophonePermissionmicrophonePermission;switch(qApp->checkPermission(microphonePermission)) {caseQt::PermissionStatus::Undetermined:        qApp->requestPermission(microphonePermission, this, &Camera::init);
       return;caseQt::PermissionStatus::Denied        qWarning("Microphone permission is not granted!");
       return;caseQt::PermissionStatus::Granted:break; }#endif

输入已分配:

    m_audioInput.reset(new QAudioInput);
    m_captureSession.setAudioInput(m_audioInput.get());

    // Camera devices:

    videoDevicesGroup = new QActionGroup(this);
    videoDevicesGroup->setExclusive(true);
    updateCameras();

UI 信号连接到对触发事件做出反应的插槽:

    connect(&m_devices, &QMediaDevices::videoInputsChanged, this, &Camera::updateCameras);

    connect(videoDevicesGroup, &QActionGroup::triggered, this, &Camera::updateCameraDevice);
    connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode);

    connect(ui->metaDataButton, &QPushButton::clicked, this, &Camera::showMetaDataDialog);
    connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this,
            &Camera::setExposureCompensation);

    setCamera(QMediaDevices::defaultVideoInput());

不过,大部分工作都是在调用setCamera()函数时完成的,该函数会传入一个QCameraDevice

setCamera()

setCamera() 使用信号和槽在用户界面和相机类功能之间建立各种连接。它还会实例化和初始化 、 和 对象。QCamera QImageCapture QMediaRecorder

void Camera::setCamera(const QCameraDevice &cameraDevice)
{
    m_camera.reset(new QCamera(cameraDevice));
    m_captureSession.setCamera(m_camera.data());

    connect(m_camera.data(), &QCamera::activeChanged, this, &Camera::updateCameraActive);
    connect(m_camera.data(), &QCamera::errorOccurred, this, &Camera::displayCameraError);

    if (!m_mediaRecorder) {
        m_mediaRecorder.reset(new QMediaRecorder);
        m_captureSession.setRecorder(m_mediaRecorder.data());
        connect(m_mediaRecorder.data(), &QMediaRecorder::recorderStateChanged, this,
                &Camera::updateRecorderState);
        connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this,
                &Camera::updateRecordTime);
        connect(m_mediaRecorder.data(), &QMediaRecorder::errorChanged, this,
                &Camera::displayRecorderError);
    }

    if (!m_imageCapture) {
        m_imageCapture.reset(new QImageCapture);
        m_captureSession.setImageCapture(m_imageCapture.get());
        connect(m_imageCapture.get(), &QImageCapture::readyForCaptureChanged, this,
                &Camera::readyForCapture);
        connect(m_imageCapture.get(), &QImageCapture::imageCaptured, this,
                &Camera::processCapturedImage);
        connect(m_imageCapture.get(), &QImageCapture::imageSaved, this, &Camera::imageSaved);
        connect(m_imageCapture.get(), &QImageCapture::errorOccurred, this,
                &Camera::displayCaptureError);
    }

静态和视频录制可视化选项卡已启用:

    m_captureSession.setVideoOutput(ui->viewfinder);

    updateCameraActive(m_camera->isActive());
    updateRecorderState(m_mediaRecorder->recorderState());
    readyForCapture(m_imageCapture->isReadyForCapture());

    updateCaptureMode();

最后调用QCamera 对象的start() 函数。

    m_camera->start();

触发捕获

现在,摄像机已准备好接受用户指令,它正在等待一个合适的事件。这种事件可以是按下应用程序窗口上的Qt::Key_CameraFocusQt::Key_Camera 按钮。

按键_CameraFocus 只需显示预览并锁定摄像机设置。

}

void Camera::keyPressEvent(QKeyEvent *event)
{
    if (event->isAutoRepeat())
        return;

    switch (event->key()) {
    case Qt::Key_CameraFocus:
        displayViewfinder();
        event->accept();
        break;

Key_Camera 在录制视频时,如果进行图像捕捉,将调用takeImage();如果已在录制,则调用 实例上的 或 (如果已在录制)。QMediaRecorder record() stop()

    case Qt::Key_Camera:
        if (m_doImageCapture) {
            takeImage();
        } else {
            if (m_mediaRecorder->recorderState() == QMediaRecorder::RecordingState)
                stop();
            else
                record();
        }
        event->accept();
        break;

示例项目 @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.