Qt 中摄像头的使用是在Qt Multimedia模块中。Qt Multimedia是一个重要模块,它提供了一组丰富的QML类型和C++类来处理多媒体内容。它还提供了访问相机和无线电功能所需的API。随附的Qt音频引擎提供了用于3D位置音频播放和内容管理的类型。Qt中的多媒体支持由模块提供。Qt多媒体模块提供了丰富的功能集,能够轻松利用平台的多媒体功能,例如媒体播放以及相机和无线电设备的使用。
window平台:
实现适用于Windows的Qt多媒体功能在两个插件中实现;一个使用Microsoft DirectShowAPI,另一个使WMF(Windows Media Foundation)框架。DirectShow API在Windows 98中引入,并从Windows XP开始逐渐弃用。Media Foundation 框架是在Windows Vista 中引入的,作为 DirectShow 和其他多媒体 API 的替代品。因此,Qt 中的 WMF 插件仅支持 Windows Vista 和更高版本的操作系统。环境变量可用于控制插件的优先级。例如,将其设置为“windowsmediafoundation”或“directshow”将导致相应的插件成为首选插件。
QT_MULTIMEDIA_PREFERRED_PLUGINS
Window 平台限制:
Qt中的WMF插件目前不提供相机后端。相反,对相机功能的有限支持由 DirectShow插件提供。支持显示取景器和捕获静止图像等基本功能,但是,未实现大多数相机控制。目前不支持视频录制。此外,DirectShow 插件不支持任何低级视频功能,例如监视正在使用或相关类播放或录制的视频帧。
音频 | |
---|---|
QAbstractAudioDeviceInfo | 音频后端的基类 |
QAudioDeviceInfo | 用于查询音频设备及其功能的界面 |
QAudio | 包含音频类使用的枚举 |
QAudioRecorder | QAudioRecorder类用于录制音频 |
QAudioEncoderSettings | QAudioEncoderSettings类提供一组音频编码器设置。 |
QAudioProbe | 允许您监控正在播放或录制的音频 |
QAudioBuffer | 表示具有特定格式和采样率的音频样本的集合 |
QAudioBuffer::StereoFrame | 立体声音频帧的简单包装器QAudioDecoder允许解码音频 |
QAudioFormat | 存储音频流参数信息 |
QAudioInput | 用于从音频输入设备接收音频数据的接口 |
QAudioOutput | 用于将音频数据发送到音频输出设备的接口 |
QAudioSystemPlugin | 音频插件的抽象基础 |
QSound | 播放.wav声音文件的方法 |
QSoundEffect | 播放低延迟音效的方式 |
视频 | |
QAbstractPlanarVideoBuffer | 平面视频数据的抽象 |
QAbstractVideoBuffer | 视频数据的抽象 |
QAbstractVideoFilter | 表示应用于 VideoOutput 类型接收的视频帧的筛选器 |
QAbstractVideoSurface | 视频演示图面的基类 |
QVideoFilterRunnable | 表示拥有所有图形和计算资源的筛选器的实现,并执行实际的筛选或计算QVideoFrame表示一帧视频数据 |
QVideoProbe | 允许您监控正在播放或录制的视频帧 |
QVideoSurfaceFormat | 指定视频演示图面的流格式 |
相机 | |
QCameraInfo | 有关相机设备的一般信息 |
QCamera | 系统摄像头设备接口 |
QCamera::FrameRateRange | 帧速率范围表示帧速率范围,包括最小和最大速率 |
QCameraExposure | 曝光相关相机设置界面 |
QCameraFocus | 用于对焦和变焦相关相机设置的界面 |
QCameraFocusZone | 有关用于相机自动对焦的区域的信息 |
QCameraViewfinderSettings | 取景器设置集 |
QCameraImageProcessing | 图像处理相关相机设置接口 |
QCameraImageCapture | 用于录制媒体内容 |
QCameraViewfinder | QCameraViewfinder类提供了一个相机取景器小部件。 |
QImageEncoderSettings | 图像编码器设置集 |
多媒体 | |
QMediaBindableInterface | 扩展媒体对象功能的对象的基类 |
QMediaContent | 访问与媒体内容相关的资源 |
QMediaObject | 多媒体对象的通用基础 |
QMediaPlayer | 允许播放媒体源 |
QMediaPlaylist | 要播放的媒体内容列表 |
QMediaRecorder | 用于录制媒体内容 |
QMediaTimeInterval | 表示具有整数精度的时间间隔 |
QMediaTimeRange | 表示一组零个或多个不相交的时间间隔 |
在qt中多媒体主要包括摄像头的调用,视频测存储(window下不支持)、视频的播放,拍照、麦克风的调用、音频的存储、音频的播放。
QT中摄像头的使用主要分为三个方面,显示画面、抓取图片和视频录制。这三个方面对应着摄像模块的三种模式。模式如下:
Constant | Value | Description |
---|---|---|
QCamera::CaptureViewfinder |
0 |
相机仅配置为显示取景器。 |
QCamera::CaptureStillImage |
0x01 |
相机已配置为静态帧捕获 |
QCamera::CaptureVideo |
0x02 |
相机已配置为用于视频捕获。 |
这三种模式都是基于QCamera对象的。在QCamera之前的操作都是一样的,例如获取设备中的摄像头等。
QT中摄像头的取景器模式,个人理解取景器模式就是单纯的将摄像机额画面显示到界面中。这个实现很简单只需要两个步骤。
1、获取系统中的摄像头设备,这里使用QCameraInfo中的函数availableCameras函数,此函数返回的是一个设备列表。
2、使用QCamera打开摄像头,并将其添加到要显示的窗口即可,这里需要注意显示摄像头的窗口为QCameraViewfinder窗口,可以将QWidget提升为QCameraViewfinder。
代码如下:
QList camerainfos = QCameraInfo::availableCameras();//获取系统中摄像头
foreach (QCameraInfo info, camerainfos) { //通过遍历摄像头列表,将器添加到下拉控件中
ui->comboBox->addItem(info.deviceName());
}
.....
camera = new QCamera(ui->comboBox->currentText().toUtf8());//选在摄像头设备,并构造QCamera对象。
camera->setViewfinder(ui->widget); //设置摄像头的显示窗体
camera->start();//启动摄像,到这里界面就可以看到摄像头中的画面了
.....
camera->stop();//停止摄像,摄像头画面将会暂停
但是在取景器模式中我们可以有两个设置可以进行画面的调整,一个是设置显示窗口可以设置显示界面的亮度、对比度、是否全屏显示、色调、饱和度等都可以通过QCameraViewfinder的函数进行调整。另一个是设置QCamera取景器的配置,包括(设置最大帧率、设置最小帧率、设置像素长宽比、设置像素格式等)。QCamera还可以设置曝光和聚焦,通过QCameraExposure和QCameraFocus。
摄像头的使用首先是肯定是显示画面,但是除了显示画面我们可能还需要保存视频和从视频中获取图片。
QT中在视频中抓取图片的步骤:抓取图片的时候需要使用都QCameraImageCapture类
1、创建QCameraImageCapture对象,传入的参数为QCamera。
2、设置相机模式为拍照模式 m_camera->setCaptureMode(QCamera::CaptureStillImage);
3、QCameraImageCapture对象调用capture函数进行图片的保存,传入参数为保存路径。
代码如下:
QString path = QFileDialog::getSaveFileName(nullptr, "保存图片",
nullptr, "*.jpg");
if(m_imageCapture == nullptr){
m_imageCapture = new QCameraImageCapture(m_camera);
}
//设置为拍照模式
m_camera->setCaptureMode(QCamera::CaptureStillImage);
//对相机锁定(异步操作)
m_camera->searchAndLock();
//拍照并且把照片保存到这个路径中
m_imageCapture->capture(path);
//解锁
m_camera->unlock();
//需要注意的是QCamera已经初始化配置过摄像头了
在拍照模式的时候保存的图片可以设置相关参数,出去QCamera设置的参数,图片的参数通过QCameraImageCapture类的setEncodingSettings函数设置,参数包括(图像质量、分辨率、编码器、编码等)。
QT在window中不能进行摄像头视频的保存,因此这里不多说,简单的说一下保存摄像视频需要使用到的类。
对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。
Qt中音频的录制
步骤:
1、获取系统中的音频设备。
2、创建QAudioRecorder对象,指定使用的音频设备,通过QAudioRecorder的setAudioInput函数设置。
3、设置音频的保存位置,通过QAudioRecorder对象的setOutputLocation函数设置。
4、设置保存的音频格式,通过QAudioRecorder对象的setAudioSettings函数设置,设置参数为QAudioEncoderSettings。
5、设置保存音频的容器格式,通过QAudioRecorder对象的setContainerFormat。
6、以上参数设置完成之后就可以QAudioRecorder对象调用record开始录制了,如果不设置相关才是,会使用系统默认的参数。
7、AudioRecorder对象调用stop()结束录制。
8、AudioRecorder对象调用pause()暂停录制。
代码如下:
QList audioDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);//获取音频的输入设备
foreach (QAudioDeviceInfo device, audioDevices) {
ui->comboBox_sound->addItem(device.deviceName());
}
......
m_audioRecorder = new QAudioRecorder(this);
QString datatime = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
m_audioName = QString("%2/audio/%3").arg(savePath).arg(datatime);
m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(m_audioName));
m_audioRecorder->setAudioInput(audioDeviceName);
QAudioEncoderSettings set;
set.setCodec("audio/wav"); // 这些是QAudioRecorder是设置,见名思意
set.setQuality(QMultimedia::EncodingQuality::HighQuality);
set.setEncodingMode(QMultimedia::ConstantQualityEncoding);
m_audioRecorder->setContainerFormat("audio/wav"); // 设置容器格式
m_audioRecorder->setAudioSettings(set);
m_audioRecorder->record();//开始录制
......
m_audioRecorder->pause();//暂停录制
......
m_audioRecorder->stop();//结束录制
以上可以完成最基本的音频录制,但是如果想使用更高端的录制,例如在录制的时候显示音频的想干信息。要想实现以上描述,需要使用Qt提供的QAudioProbe类来监控音频数据。
实现步骤如下:
1、创建QAudioProbe对象。
2、QAudioProbe对象通过调用setSource函数设置监控对象,传入参数为AudioRecorder对象。这里QAudioProbe对象监控的就是AudioRecorder对象对象输入的音频。
3、实现QAudioProbe::audioBufferProbed信号槽函数,这个信号是当在媒体服务中处理音频缓冲器时发出该。信号会传递一个QAudioBuffer 格式的音频数据。
4、实现槽函数接收QAudioBuffer 类型的数据,之后通过对接收到数据的计算实现频谱或者其他的显示。
代码如下:
m_audioRecordProbe = new QAudioProbe(this);
m_audioRecorder = new QAudioRecorder(this);
//显示
m_audioRecordProbe->setSource(m_audioRecorder); // 指定声源
connect(m_audioProbe, &QAudioProbe::audioBufferProbed, this,[=](const QAudioBuffer &buffer){
emit audioProcessBuff(buffer);
});
Qt中音频的播放
步骤:
1、创建一个QMediaPlayer对象。
2、创建QMediaPlaylist对象。
3、通过QMediaPlaylist对象的setPlaybackMode函数创建列表的循环模式。
Constant | Value | Description |
---|---|---|
QMediaPlaylist::CurrentItemOnce |
0 |
当前项目只播放一次。 |
QMediaPlaylist::CurrentItemInLoop |
1 |
当前项目在循环中重复播放 |
QMediaPlaylist::Sequential |
2 |
播放从当前开始,在每个连续项目中移动,直到到达最后一个项目,然后停止。当前正在播放上一个项目时,下一个项目为空项目。 |
QMediaPlaylist::Loop |
3 |
播放在最后一个项目播放完毕后的第一个项目处重新开始。 |
QMediaPlaylist::Random |
4 |
按随机顺序播放项目 |
4、 QMediaPlayer对象通过函数setPlaylist设置播放列表,参数为QMediaPlaylist对象。
5、向播放列表中添加需要播放的音频,通过QMediaPlaylist对象addMedia函数添加音频列表。
6、在音频列表中选择需要播放的音频,使用QMediaPlaylist对象的setCurrentIndex函数,参数为音频标号。
7、QMediaPlayer对象调用play函数播放音频。
8、QMediaPlayer对象调用pause函数暂停播放音频。
9、QMediaPlayer对象调用stop函数停止播放音频。
代码如下:
m_mediaPlayer = new QMediaPlayer(this);
m_mediaPlaylist = new QMediaPlaylist(this);
m_mediaPlaylist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
m_mediaPlayer->setPlaylist(m_mediaPlaylist);
......
m_mediaPlaylist->addMedia(QUrl::fromLocalFile(filePath));
......
m_mediaPlaylist->setCurrentIndex(index);
......
m_mediaPlayer->play();
......
m_mediaPlayer->pause();
......
m_mediaPlayer->stop();
QMediaPlayer除了播放、暂停、停止播放外,还有其他设置,例如设置声音大小,快进、快退等。都可以通过QMediaPlayer对象的函数进行设置。也可以通过QAudioProbe对象对播放的音频进行监听,实现播放音频声波的可视化。方法和录制一样。
通过QSound类播放音频:暂不介绍
Qt多媒体也支持视频的播放,视频的播放相对来说比较简单。
步骤如下:
1、创建一个QMediaPlayer对象。
2、设置显示UI窗口。
3、设置需要播放的视频路径。
4、QMediaPlayer对象调用play函数播放音频。
5、QMediaPlayer对象调用pause函数暂停播放音频。
6、QMediaPlayer对象调用stop函数停止播放音频。
代码如下:
m_mediapPlay = new QMediaPlayer(this);
m_mediapPlay->setNotifyInterval(1000);
m_mediapPlay->setVideoOutput(ui->mainwidget);
......
m_mediapPlay->setMedia(QUrl::fromLocalFile(m_filePath));
m_mediapPlay->play();
m_mediapPlay->pause();
音频和视频播放都使用的是QMediaPlayer对象,只不过是视频多设置了一个视频输出窗口。通过QMediaPlayer类的一些信号和槽可以获取到当前播放影视频的大小,播放位置,播放装态等,可以根据这些信息更好的实现播放功能。