You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT C++开发相机应用如何实现视频录制过程中同步捕获图片?

Qt C++ 录像过程中同步拍照实现方案

核心逻辑:Qt Multimedia 模块的 QMediaCaptureSession 支持同一相机实例同时绑定视频录制器(QMediaRecorder)和图像捕获器(QImageCapture),两个组件并行工作互不干扰,无需手动拆分相机流。

1. 初始化阶段绑定双组件

在相机初始化逻辑中,将录像和拍照组件挂载到同一个 capture 会话下:

// 类成员声明
QCamera *m_camera;
QMediaCaptureSession *m_captureSession;
QMediaRecorder *m_recorder;
QImageCapture *m_imageCapture;

// 初始化代码(执行在相机启动前)
m_camera = new QCamera(this);
m_captureSession = new QMediaCaptureSession(this);
m_recorder = new QMediaRecorder(this);
m_imageCapture = new QImageCapture(this);

// 统一绑定到同一会话
m_captureSession->setCamera(m_camera);
m_captureSession->setRecorder(m_recorder);
m_captureSession->setImageCapture(m_imageCapture);

// 启动相机
m_camera->start();

2. 录像状态下直接触发拍照

录像过程中(即 m_recorder->isRecording() 为 true 时),直接调用图像捕获接口即可,不会打断正在进行的录像:

// 拍照触发槽函数(绑定到拍照按钮点击信号)
void CameraApp::onTakePhotoClicked()
{
    if (m_imageCapture->isReadyForCapture()) {
        // 自定义照片存储路径,不填参数则默认存储到系统图片目录
        QString savePath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) 
                         + QString("/capture_%1.jpg").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
        m_imageCapture->capture(savePath);
    }
}

如果需要直接获取内存中的图片做二次处理,绑定 imageCaptured 信号即可:

connect(m_imageCapture, &QImageCapture::imageCaptured, this, [=](int captureId, const QImage &img){
    // img 即为捕获的原始图片,可自行处理(如显示预览、添加水印等)
    qDebug() << "拍照完成,图片分辨率:" << img.size();
});

3. 常见适配问题处理

  • 分辨率冲突:拍照分辨率可独立设置,不受录像分辨率限制,手动配置即可:
    m_imageCapture->setResolution(QSize(3840, 2160)); // 按需设置拍照分辨率
    
  • 版本兼容:Qt 5.14及更早版本的多媒体模块对同会话双组件支持存在缺陷,建议升级到 Qt 5.15.x 或 Qt 6.x 版本使用该方案
  • 性能优化:如果拍照瞬间出现录像掉帧,可适当降低拍照分辨率,且不要在 imageCaptured 回调中执行耗时操作

内容的提问来源于stack exchange,提问作者Anil Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:18:03