当前位置: 首页 > news >正文

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

http://www.cnnetsun.cn/news/1351670.html

相关文章:

  • 探索音乐创新:PedalinoMini™ —— 蓝牙WiFi MIDI控制器
  • 爬虫 APP 逆向 ---> 粉笔考研
  • AtomPePacker 开源项目教程
  • 北航论文格式零失误:BUAAthesis模板中图表、公式与代码块的规范使用
  • 从明文暴露到安全存储:Keyring彻底解决Python密码管理痛点
  • PDF4QT命令行工具详解:自动化处理PDF文档的实用技巧
  • java基于微信小程序的陕西省红色旅游管理系统_dkv6632x
  • leetcode153.寻找旋转排序数组中的最小值
  • MySQL数据库初体验
  • 【即插即用完整代码】CVPR 2026新方法归一化空间与通道注意力,无额外参数,轻量且高效,超越CBAM,快速涨点,发表论文!
  • BetterNCM 插件导致网易云音乐启动失败问题分析
  • Camera:实时监控与数据交互的智能设备服务
  • 事件日志清理与痕迹擦除:wmiexec-Pro的eventlog模块深度应用
  • 告别厂商限制:Tuya TH05Z温湿度传感器接入Zigbee2MQTT完全指南
  • 复购率不理想如何用产品线组合提升长期价值
  • SimpleMem快速上手指南:5分钟搭建LLM智能体记忆系统
  • 基于LangChain的RAG与Agent智能体开发 - 使用LangChain调用大语言模型
  • MiniChain与Hugging Face Datasets:实现高效文档嵌入与相似度搜索的完整指南
  • Deepagents数据可视化:展示AI代理工作成果的终极指南
  • LDNetDiagnoService_IOS架构解析:Ping与Traceroute原理在iOS中的实现
  • 突破Ebitengine着色器限制:多重赋值问题的优雅解决方案
  • 告别繁琐切换!Micro编辑器智能文件类型识别功能详解:让编码效率提升300%的秘诀
  • STK信号处理秘籍:BiQuad滤波器与Chorus效果的应用技巧
  • Python入门:Python3 Pickle模块全面学习教程
  • Deepagents边境安全:监控边境活动的AI代理
  • 打造个性化观影系统:embyToLocalPlayer高级设置与自定义技巧
  • Performer-PyTorch核心组件解析:FastAttention如何实现O(n)复杂度
  • 提升家庭影院体验:embyToLocalPlayer与Kodi、Plex联动使用指南
  • cp-ddd-framework扩展机制详解:@Extension注解让业务逻辑灵活扩展
  • cp-ddd-framework架构演进:如何支撑业务系统从单体到微服务