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包含音频类使用的枚举
QAudioRecorderQAudioRecorder类用于录制音频
QAudioEncoderSettingsQAudioEncoderSettings类提供一组音频编码器设置。
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用于录制媒体内容
QCameraViewfinderQCameraViewfinder类提供了一个相机取景器小部件。
QImageEncoderSettings图像编码器设置集
多媒体
QMediaBindableInterface扩展媒体对象功能的对象的基类
QMediaContent访问与媒体内容相关的资源
QMediaObject多媒体对象的通用基础
QMediaPlayer允许播放媒体源
QMediaPlaylist要播放的媒体内容列表
QMediaRecorder用于录制媒体内容
QMediaTimeInterval表示具有整数精度的时间间隔
QMediaTimeRange表示一组零个或多个不相交的时间间隔

在qt中多媒体主要包括摄像头的调用,视频测存储(window下不支持)、视频的播放,拍照、麦克风的调用、音频的存储、音频的播放。

摄像头的使用(相机)

QT中摄像头的使用主要分为三个方面,显示画面、抓取图片和视频录制。这三个方面对应着摄像模块的三种模式。模式如下:

ConstantValueDescription
QCamera::CaptureViewfinder0相机仅配置为显示取景器。
QCamera::CaptureStillImage0x01相机已配置为静态帧捕获
QCamera::CaptureVideo0x02相机已配置为用于视频捕获。

这三种模式都是基于QCamera对象的。在QCamera之前的操作都是一样的,例如获取设备中的摄像头等。

QT中摄像头的取景器模式,个人理解取景器模式就是单纯的将摄像机额画面显示到界面中。这个实现很简单只需要两个步骤。

1、获取系统中的摄像头设备,这里使用QCameraInfo中的函数availableCameras函数,此函数返回的是一个设备列表。

2、使用QCamera打开摄像头,并将其添加到要显示的窗口即可,这里需要注意显示摄像头的窗口为QCameraViewfinder窗口,可以将QWidget提升为QCameraViewfinder。

代码如下:

QList<QCameraInfo>  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<QAudioDeviceInfo>  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函数创建列表的循环模式。

ConstantValueDescription
QMediaPlaylist::CurrentItemOnce0当前项目只播放一次。
QMediaPlaylist::CurrentItemInLoop1当前项目在循环中重复播放
QMediaPlaylist::Sequential2播放从当前开始,在每个连续项目中移动,直到到达最后一个项目,然后停止。当前正在播放上一个项目时,下一个项目为空项目。
QMediaPlaylist::Loop3播放在最后一个项目播放完毕后的第一个项目处重新开始。
QMediaPlaylist::Random4按随机顺序播放项目

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬告:该系列的课程在抓紧录制更新,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:Qt麦克风数据探测、FFmpeg解码音频数据、音频波形图、音频播放器。具体内容包括:1.Qt采集麦克风并探测数据,生成动态矩形图。2.FFMpeg解码音频数据,生成PCM数据,并绘制波形图。3.音频播放器实战。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。
如果你要在 Linux 上使用 Qt 框架进行开发,可能需要安装 Qt 的 x11extras 模块。这个模块包含了一些额外的 X11 工具和函数,可以帮助你更方便地开发基于 Qt 的 X11 应用程序。但是,如果你想在另一台机器上运行你的应用程序,你需要进行交叉编译,以便将应用程序编译为目标机器的二进制文件。下面是一个简单的步骤: 1. 安装交叉编译工具链 要进行交叉编译,你需要先安装交叉编译工具链。这个工具链包含了编译器、链接器和其他必要的工具,可以将你的代码编译为目标机器上的二进制文件。你可以从交叉编译工具链提供商的网站上下载并安装它们。一些常见的交叉编译工具链提供商包括:CodeSourcery、Android NDK 和 Linaro。 2. 下载 Qt 源代码 你需要下载 Qt 源代码并解压它。你可以从 Qt 的官方网站上下载 Qt 源代码,或者从 Git 存储库克隆代码。在下载完源代码后,你需要解压它。 3. 配置 Qt 使用交叉编译工具链进行编译之前,你需要配置 Qt。在 Linux 上,你可以使用以下命令来配置 Qt: ``` ./configure -prefix /path/to/installation -xplatform linux-arm-gnueabi-g++ -embedded arm -little-endian -no-pch -no-qt3support -no-opengl -no-openvg -no-xcb -no-xkb -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -no-nis -no-iconv -no-freetype -no-fontconfig -no-sm -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xvideo -no-xsync -no-xshm -no-mtdev -no-glib -no-icu -no-dbus -no-pulseaudio -no-alsa -no-sql-sqlite -no-sql-mysql -no-sql-odbc -no-sql-ibase -no-sql-psql -no-sql-sqlite2 -no-sql-tds -no-gif -no-jpeg -no-mng -no-png -no-tiff -no-xmlpatterns -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-qtwebkit -no-javascript-jit -no-qml-debug -no-qml-debugger -no-exceptions -no-stl -no-rtti -no-reduce-relocations -no-gui -no-widgets -no-audio-backend -no-qttest -no-rpath ``` 这个命令将 Qt 配置为使用交叉编译工具链进行编译。你需要根据你的目标机器和交叉编译工具链进行修改。一些常见的配置选项包括: - `-prefix`:指定 Qt 安装路径。 - `-xplatform`:指定目标机器的平台。 - `-no-gui`:禁用 Qt GUI 模块,因为你只需要编译 x11extras 模块。 4. 编译 Qt 配置完成后,你可以使用以下命令进行 Qt 编译: ``` make ``` 这个命令将使用交叉编译工具链进行编译,并生成目标机器上的二进制文件。整个编译过程可能需要一些时间,取决于你的计算机性能和编译选项。 5. 安装 x11extras 模块 完成 Qt 编译后,你需要将 x11extras 模块安装到目标机器上。你可以使用以下命令将模块复制到目标机器上: ``` make install ``` 这个命令将把 Qt 安装到指定的安装路径。你需要在目标机器上运行这个命令,以便将 x11extras 模块复制到目标机器上。完成安装后,你就可以在目标机器上使用 Qt 的 x11extras 模块了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值