前言:
Qt6对多媒体模块做了大量修改,虽然当前不少bug,但却是未来的发展方向。本次示例先从获取摄像头的帧开始,仅使用Qt6的库
一、新建Qt工程
编译系统使用qmake
qt6.2.1的套件可以使用
注:
1.Qt6.2中,多媒体模块只能在VS编译器下使用,不支持minGW编译器
2.Qt6.2的官方预编译库,只有64位的,没有32位的
二、修改工程文件
在pro文件中,加入多媒体模块
QT += multimedia multimediawidgets
三、绘制测试UI
这是笔者已绘制的UI
四、关键代码
//初始化下拉择选项框
const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
ui->comboBox->blockSignals(true);
for (const QCameraDevice &cameraDevice : cameras) {
qDebug()<<cameraDevice.description();
ui->comboBox->addItem(cameraDevice.description(), cameraDevice.id());
}
ui->comboBox->blockSignals(false);
//初始化摄像头
m_camera = new QCamera(QMediaDevices::defaultVideoInput());
connect(m_camera, &QCamera::errorOccurred, [this](){
qDebug()<< "camera error occurred"<<this->m_camera->errorString();
});
//初始化摄像头会话管理
m_captureSession = new QMediaCaptureSession;
m_captureSession->setCamera(m_camera);
m_captureSession->setVideoOutput(ui->videowidget);
五、运行程序
点击开始或切换摄像头,就可以看到预览画面
示例源码下载
后记:
本示例笔者是在win10系统下进行的,其他平台可能会有一些差异
本示例仅是一测试程序,实际使用时,可能会遇到一些问题,请读者自行解决
也有读者要问,为什么不直接使用第三方库呢?笔者承认,不少第三方库,如opencv会很轻松打开摄像头,但需要引入第三方库。一方面,直接使用Qt库,就不用再引入库了;另一方面,opencv摄像头的唯一ID可能要自己做了,而Qt已经做好了
注:
1.当摄像头被其他程序占用时,Qt无法打开
2.当多个摄像头接入同一USB总线上时,若流量太大,可能无法同时打开多个摄像头
3.本示例只能使用VS编译器