カメラ使用例
静止画を撮影したり、動画を録画する方法を説明します。
Camera Example は、Qt Multimedia を使用して、静止画を撮影したり、音声付きのビデオクリップを録画したりする基本的な Camera 機能を実装する方法を示します。
サンプルを実行する
Qt Creator からサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Example を参照してください。
このサンプルは、カメラ・インターフェースとして動作するCamera
クラスを実装しています。このクラスには、ユーザー・インターフェース、制御関数、設定値、画像やビデオ・クリップの保存場所を定義する手段があります。また、画像やビデオの設定も保存されます。
Cameraクラスは以下のものを使用します:
- ハードウェアへのAPIクラス・インターフェースであるQCamera のインスタンス。
- 静止画を撮影するQImageCapture のインスタンス。
- QMediaRecorder のインスタンスで、ビデオを録画します。また、ユーザー・インターフェース・オブジェクトも含まれます。
カメラのコンストラクタ
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) // camera QCameraPermission cameraPermission; switch (qApp->checkPermission(cameraPermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(cameraPermission, this, &Camera::init); return; case Qt::PermissionStatus::Denied: qWarning("Camera permission is not granted!"); return; case Qt::PermissionStatus::Granted: break; } // microphone QMicrophonePermission microphonePermission; switch (qApp->checkPermission(microphonePermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(microphonePermission, this, &Camera::init); return; case Qt::PermissionStatus::Denied: qWarning("Microphone permission is not granted!"); return; case Qt::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()
は、シグナルとスロットを使用して、ユーザー・インターフェースとCameraクラスの機能の間のさまざまな接続を設定します。また、 、 、 オブジェクトのインスタンス化と初期化も行われる。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_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;
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。