本页内容

相机示例

演示如何拍摄静态图像或录制视频。

带图像和视频拍摄控制功能的相机应用程序界面

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

运行示例

您可以从以下位置运行该示例:

该示例实现了一个Camera 类,用作我们的相机接口。它包含用户界面、控制功能、设置选项,以及定义图像或视频片段保存位置的功能。它还会保存图像和视频的设置。

Camera 类使用:

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

Camera 构造函数

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

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)
    // 摄像头
    QCameraPermission cameraPermission;
    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;
    }
    // 麦克风
    QMicrophonePermission 麦克风权限;
    switch(qApp->checkPermission(麦克风权限)) {
    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);

    setCamera(QMediaDevices::defaultVideoInput());

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

setCamera()

setCamera() 通过信号和槽,在用户界面与 Camera 类的功能之间建立各种连接。它还会实例化并初始化QCamera 、QImageCapture 和QMediaRecorder 对象。

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

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

    if (!m_mediaRecorder) {
        m_mediaRecorder.reset(new QMediaRecorder);
        m_captureSession.setRecorder(m_mediaRecorder.get());
        connect(m_mediaRecorder.get(), &QMediaRecorder::recorderStateChanged, this,
                &Camera::updateRecorderState);
        connect(m_mediaRecorder.get(), &QMediaRecorder::durationChanged, this,
                &Camera::updateRecordTime);
        connect(m_mediaRecorder.get(), &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_CameraFocus 或Qt::Key_Camera 按钮的按键操作。

Key_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

© 2026 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.