程序功能
-
摄像头管理
-
自动检测可用摄像头设备,支持切换不同摄像头。
-
显示摄像头基本信息(位置、支持的拍照/视频分辨率、帧率范围等)。
-
支持摄像头启停控制。
-
-
拍照功能
-
支持实时预览摄像头画面。
-
可设置图片分辨率、编码质量、是否保存到文件。
-
拍照时播放快门音效(可选)。
-
拍照后显示预览图,并在状态栏显示保存路径。
-
-
视频录制功能
-
支持选择视频编码、文件格式、分辨率和编码质量。
-
录制时显示实时时长,支持暂停/停止录制。
-
自动删除已存在的同名文件,避免冲突。
-
-
状态显示
-
实时显示录制时间、图片分辨率、错误信息等。
-
程序结构
-
模块组成
-
main.cpp
:程序入口,初始化应用和主窗口。 -
mainwindow.h/cpp
:主窗口逻辑实现,包含摄像头控制、媒体会话管理、信号槽连接等。 -
mainwindow.ui
:UI 布局文件,定义界面元素和交互逻辑。 -
.pro
文件:项目配置,包含依赖模块和资源文件。
-
-
核心类与组件
-
QCamera
:管理摄像头设备输入。 -
QMediaCaptureSession
:协调摄像头、音频输入、视频输出和录制器。 -
QImageCapture
:处理拍照功能。 -
QMediaRecorder
:处理视频录制功能。 -
QVideoWidget
:显示摄像头实时预览画面。
-
实现思路
-
初始化与摄像头检测
-
使用
QMediaDevices
检测可用摄像头设备,默认选择系统推荐设备。 -
通过
QCameraDevice
获取设备详细信息,填充到 UI 下拉框中。
-
-
媒体会话管理
-
创建
QMediaCaptureSession
会话,绑定摄像头、音频输入、视频预览窗口和录制器。 -
配置音频输入设备为默认麦克风。
-
-
信号与槽机制
-
连接摄像头状态变化信号(如
QCamera::activeChanged
),更新按钮状态。 -
连接图像捕获信号(如
QImageCapture::imageCaptured
),更新预览图和状态栏。 -
处理录制状态变化(如
QMediaRecorder::durationChanged
),实时显示录制时间。
-
-
错误处理
-
捕获摄像头未找到、文件删除失败等异常,通过
QMessageBox
提示用户。
-
功能实现方法
1. 摄像头初始化与切换
// mainwindow.cpp 构造函数中
QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
for (auto &device : cameras) {
if (device.id() == defaultid) {
ui->comboCam_List->addItem(device.description() + "(默认)", QVariant::fromValue(device));
} else {
ui->comboCam_List->addItem(device.description(), QVariant::fromValue(device));
}
}
connect(ui->comboCam_List, &QComboBox::currentIndexChanged, this, &MainWindow::do_currentIndexChanged);
2. 拍照功能实现
// 拍照按钮触发
void MainWindow::on_actCapture_triggered() {
imagecapture->setResolution(ui->comboImage_Resolution->currentData().toSize());
if (ui->chkBox_Sound->isChecked()) soundeffect->play();
if (ui->chkBox_SaveToFile->isChecked()) {
imagecapture->captureToFile(); // 保存到文件
} else {
imagecapture->capture(); // 仅预览
}
}
3. 视频录制配置
// 开始录制
void MainWindow::on_actVideoRecord_triggered() {
QMediaFormat format;
format.setVideoCodec(ui->comboVideo_Codec->currentData().value<QMediaFormat::VideoCodec>());
format.setFileFormat(ui->comboVideo_FileFormat->currentData().value<QMediaFormat::FileFormat>());
recorder->setMediaFormat(format);
recorder->setOutputLocation(QUrl::fromLocalFile(ui->editVideo_OutputFile->text()));
recorder->record();
}
4. 状态栏更新
// 录制时间更新
void MainWindow::do_durationChanged(qint64 duration) {
labduration->setText(QString::asprintf("录制时间:%.1f秒", duration / 1000.0));
}
代码亮点
-
模块化设计:通过
QMediaCaptureSession
统一管理摄像头、音频、录制器和预览窗口。 -
动态配置:UI 控件(如分辨率下拉框)根据摄像头支持的格式动态生成。
-
错误鲁棒性:文件保存前检查路径有效性,录制前删除旧文件避免冲突。
潜在改进点
-
视频编码设置:当前代码中
comboVideo_FileFormat
的索引被错误复用(如设置分辨率和质量时),需修正为使用正确的控件索引。 -
资源管理:退出时需确保所有设备资源(如摄像头、音频输入)正确释放。
-
国际化支持:硬编码的中文字符串可提取为翻译文件,支持多语言。
该程序完整实现了摄像头拍照与录像的核心功能,代码结构清晰,适合作为多媒体应用的开发参考。