前言:
前面几篇教程,都是介绍了使用Qt5.15.2取出视频帧,本篇解决从Qt6.2.1中取出视频帧
本教程是在Qt6.2.1(widget)摄像头显示 示例代码的基础上修改
注意,本教程示例,在windows下,只能在VS编译中运行
一、修改UI显示
如下所示,是笔者修改的UI
二、主函数中初始化,并调用
关键代码如下
//初始化摄像头
m_camera = new QCamera(QMediaDevices::defaultVideoInput());
connect(m_camera, &QCamera::errorOccurred, [this](){
qDebug()<< "camera error occurred"<<this->m_camera->errorString();
});
//初始化取摄像头帧的类
m_videoSink = ui->videoWidget->videoSink();
connect(m_videoSink, &QVideoSink::videoFrameChanged,
[this](const QVideoFrame &frame){
ui->label->setPixmap(QPixmap::fromImage(frame.toImage().scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio)));
});
m_captureSession = new QMediaCaptureSession;
m_captureSession->setCamera(m_camera);
m_captureSession->setVideoOutput(ui->videoWidget);
有没有感觉太清爽,几行代码就搞定了
若不需要在UI中显示,可以这样修改
//初始化摄像头
m_camera = new QCamera(QMediaDevices::defaultVideoInput());
connect(m_camera, &QCamera::errorOccurred, [this](){
qDebug()<< "camera error occurred"<<this->m_camera->errorString();
});
//初始化取摄像头帧的类
m_videoSink = new QVideoSink;
connect(m_videoSink, &QVideoSink::videoFrameChanged,
[this](const QVideoFrame &frame){
ui->label->setPixmap(QPixmap::fromImage(frame.toImage().scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio)));
});
m_captureSession = new QMediaCaptureSession;
m_captureSession->setCamera(m_camera);
m_captureSession->setVideoOutput(ui->videoWidget);
m_captureSession->setVideoSink(m_videoSink);
运行效果如下
本教程示例源码
后记
感觉使用Qt6,比Qt5的代码简洁多了,但Qt6多媒体,在Windows下,只支持VS编译器,不支持win7,官方只提供64位预编译库
PS.Qt6的多媒体模块仍然存在不少坑,请小伙伴们注意测试下