このページでは

カメラの例

静止画の撮影や動画の録画方法について説明します。

画像および動画の撮影機能を備えたカメラアプリケーションのインターフェース

「カメラの例」では、 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 microphonePermission;
    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);

    setCamera(QMediaDevices::defaultVideoInput());

ただし、実際の処理の大部分は、QCameraDevice を引数として渡してsetCamera()関数が呼び出された際に行われます。

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.