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

“相机示例”演示了如何使用 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 类使用:
- 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(); 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.