카메라 예제
정지 이미지를 캡처하거나 동영상을 녹화하는 방법을 보여줍니다.
카메라 예제에서는 카메라 예제를 사용하여 Qt Multimedia 를 사용하여 몇 가지 기본 카메라 기능을 구현하여 정지 이미지를 찍고 오디오가 포함된 비디오 클립을 녹화하는 방법을 보여줍니다.
예제 실행하기
에서 예제를 실행하려면 Qt Creator에서 Welcome 모드를 열고 Examples 에서 예제를 선택합니다. 자세한 내용은 예제 빌드 및 실행하기를 참조하세요.
이 예제에서는 카메라 인터페이스 역할을 하는 Camera
클래스를 구현합니다. 이 클래스에는 사용자 인터페이스, 제어 기능, 설정 값 및 이미지 또는 비디오 클립을 저장할 위치를 정의하는 수단이 있습니다. 또한 이미지 및 비디오 설정도 저장합니다.
카메라 클래스가 사용하는
- 하드웨어에 대한 API 클래스 인터페이스인 QCamera 인스턴스.
- 정지 이미지를 촬영하기 위한 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) // camera QCameraPermission cameraPermission; switch (qApp->checkPermission(cameraPermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(cameraPermission, this, &Camera::init); 반환; 케이스 Qt::권한 상태::거부됨: 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); 반환; 케이스 Qt::권한 상태::거부됨: 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());
그러나 대부분의 작업은 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.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 버튼을 누르는 것일 수 있습니다.
키_카메라포커스는 단순히 미리보기를 표시하고 카메라 설정을 잠급니다.
} 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;
© 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.