Qt 中多媒体模块的使用

Qt模块中类的介绍

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类的一些信号和槽可以获取到当前播放影视频的大小,播放位置,播放装态等,可以根据这些信息更好的实现播放功能。

你可能感兴趣的:(Qt笔记,qt,开发语言)