QT6使用摄像头拍照和录制视频程序

 

程序功能

  1. 摄像头管理

    • 自动检测可用摄像头设备,支持切换不同摄像头。

    • 显示摄像头基本信息(位置、支持的拍照/视频分辨率、帧率范围等)。

    • 支持摄像头启停控制。

  2. 拍照功能

    • 支持实时预览摄像头画面。

    • 可设置图片分辨率、编码质量、是否保存到文件。

    • 拍照时播放快门音效(可选)。

    • 拍照后显示预览图,并在状态栏显示保存路径。

  3. 视频录制功能

    • 支持选择视频编码、文件格式、分辨率和编码质量。

    • 录制时显示实时时长,支持暂停/停止录制。

    • 自动删除已存在的同名文件,避免冲突。

  4. 状态显示

    • 实时显示录制时间、图片分辨率、错误信息等。

程序结构

  • 模块组成

    • main.cpp:程序入口,初始化应用和主窗口。

    • mainwindow.h/cpp:主窗口逻辑实现,包含摄像头控制、媒体会话管理、信号槽连接等。

    • mainwindow.ui:UI 布局文件,定义界面元素和交互逻辑。

    • .pro 文件:项目配置,包含依赖模块和资源文件。

  • 核心类与组件

    • QCamera:管理摄像头设备输入。

    • QMediaCaptureSession:协调摄像头、音频输入、视频输出和录制器。

    • QImageCapture:处理拍照功能。

    • QMediaRecorder:处理视频录制功能。

    • QVideoWidget:显示摄像头实时预览画面。

实现思路

  1. 初始化与摄像头检测

    • 使用 QMediaDevices 检测可用摄像头设备,默认选择系统推荐设备。

    • 通过 QCameraDevice 获取设备详细信息,填充到 UI 下拉框中。

  2. 媒体会话管理

    • 创建 QMediaCaptureSession 会话,绑定摄像头、音频输入、视频预览窗口和录制器。

    • 配置音频输入设备为默认麦克风。

  3. 信号与槽机制

    • 连接摄像头状态变化信号(如 QCamera::activeChanged),更新按钮状态。

    • 连接图像捕获信号(如 QImageCapture::imageCaptured),更新预览图和状态栏。

    • 处理录制状态变化(如 QMediaRecorder::durationChanged),实时显示录制时间。

  4. 错误处理

    • 捕获摄像头未找到、文件删除失败等异常,通过 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 的索引被错误复用(如设置分辨率和质量时),需修正为使用正确的控件索引。

  • 资源管理:退出时需确保所有设备资源(如摄像头、音频输入)正确释放。

  • 国际化支持:硬编码的中文字符串可提取为翻译文件,支持多语言。

该程序完整实现了摄像头拍照与录像的核心功能,代码结构清晰,适合作为多媒体应用的开发参考。

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值