카메라 예시
정지 이미지를 촬영하거나 동영상을 녹화하는 방법을 보여줍니다.

이 카메라 예제는 Qt Multimedia 를 사용하여 정지 이미지를 촬영하고 오디오가 포함된 동영상 클립을 녹화하는 기본적인 카메라 기능을 구현하는 방법을 보여줍니다.
예제 실행하기
다음 위치에서 예제를 실행할 수 있습니다:
- Qt Creator
Welcome 모드를 열고 Examples 에서 예제를 선택합니다. 자세한 내용은 Qt Creator: 튜토리얼: 빌드 및 실행을 참조하십시오.
- Qt Extension for Visual Studio Code
Command Palette 에서 Qt: Open Qt examples 명령을 실행하고 목록에서 예제를 선택하십시오. 자세한 내용은 Qt Extension for Visual Studio Code: 튜토리얼: 빌드 및 실행을 참조하십시오.
이 예제는 카메라 인터페이스 역할을 하는 Camera 클래스를 구현합니다. 이 클래스에는 사용자 인터페이스, 제어 기능, 설정 값 및 이미지나 비디오 클립을 저장할 위치를 정의하는 기능이 포함되어 있습니다. 또한 이미지 및 비디오 설정도 저장합니다.
Camera 클래스는 다음을 사용합니다:
- 하드웨어에 대한 API 클래스 인터페이스인 ` QCamera`의 인스턴스.
- 정지 이미지를 촬영하기 위한 ` 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)) {
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);
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;© 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.