Qt 播放音频文件的几种方式

news2024/11/16 19:00:15
头图

文章目录

    • 摘要
    • 1 QMediaPlayer
      • 1.1 播放音频文件
      • 1.2 播放视频文件
      • 1.3 我遇到的问题
    • 2 QSound
    • 3 QSoundEffect
    • 4 QAudioOutput

关键字: QtQSoundQSoundEffectQMediaPlayermultimedia

摘要

这篇文章至少拖了有一两个月了,这不阳了,在家实在是难受的要死,无心处理工作的事情,那就写写博客吧,因为项目中需要用到播放音频的功能,CV了部分代码,这里就简单的扯扯我对QSound QSoundEffect QMediaPlayer一点点浅陋的认知。

1 QMediaPlayer

官网描述

The QMediaPlayer class is a high level media playback class. It can be used to playback such content as songs, movies and internet radio. The content to playback is specified as a QMediaContent object, which can be thought of as a main or canonical URL with additional information attached. When provided with a QMediaContent playback may be able to commence.

我理解呢,就是说QMediaPlayer 是一个高级媒体播放类,它可以用于播放歌曲电影网络广播等内容。要播放的内容被指定为QMediaContent对象,可以将其视为带有附加新的主要或规范的URL,当提供QMediaContent时,就可以开始播放了。

1.1 播放音频文件

播放音频文件的话,这里贴一下官方的示例代码;

 player = new QMediaPlayer;
 connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
 player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
 player->setVolume(50);
 player->play();

第一行,我们新建了一个QMediaPlayer对象;

第二行,我们将这个对象的位置改变信号连接到了位置改变的槽函数上

第三行,我们指定了我们音频文件的URL路径;

第四行,我们设置了播放器的音量为50 ;

第五行,开始播放音频文件。

1.2 播放视频文件

QVideoWidget can be used with QMediaPlayer for video rendering and QMediaPlaylist for accessing playlist functionality.

这里出现了一个新的类QVideoWidget ,官方描述说QVideoWidget 可以与QMediaPlayer 一起,用于视频渲染,与QMediaPlaylist 一起用于访问播放列表功能。同样,看下官方的示例代码。

 playlist = new QMediaPlaylist;
 playlist->addMedia(QUrl("http://example.com/movie1.mp4"));
 playlist->addMedia(QUrl("http://example.com/movie2.mp4"));
 playlist->addMedia(QUrl("http://example.com/movie3.mp4"));
 playlist->setCurrentIndex(1);
 player = new QMediaPlayer;
 player->setPlaylist(playlist);
 videoWidget = new QVideoWidget;
 player->setVideoOutput(videoWidget);
 videoWidget->show();
 player->play();

第一行,新建一个QMediaPlaylist对象,也就是播放列表对象;

第二行,第三行,第四行,分别向播放列表中加入视频文件;

第五行,把播放列表的当前索引值设置为1,也就是默认播放第二个视频(这里不确定哈);

第六行,新建一个QMediaPlayer对象;

第七行,给QMediaPlayer对象设置播放列表;

第八行,新建一个QVideoWidget对象,用于视频渲染;

第九行,设置QMediaPlayer的视频输出对象,就是我们第八行新建的视频渲染窗口;

第十行,显示QVideoWidget视频渲染窗口;

第十一行,开始播放。

1.3 我遇到的问题

这里说说我遇到的问题,我开始的需求是用QMediaPlayer来播放wav音频文件,当做提示音的,就是那种按钮按下的信息,警告信息啥的,这类音频好像被统称为提示音。但是呢,我遇到的问题主要就是延迟问题,就是总感觉这个音频播放的是慢半拍,开始以为是我音频文件问题,有淡入和淡出。处理了音频文件后,问题并没有太多的改善,尽管研究QMediaPlayer的时候,发现有一个低延迟的参数,但是好像还是不咋理想。

image-20221215202952485

2 QSound

Qt provides the most commonly required audio operation in GUI applications: asynchronously playing a sound file. This is most easily accomplished using the static play() function:

Qt 提供了 GUI 应用程序中最常需要的音频操作:异步播放声音文件。 使用静态 play() 函数最容易实现这一点。粗略看,就是播放音频文件的一个简单类。可以直接使用静态函数play()播放音频。

QSound::play("mysounds/bells.wav");

另一种,就是创建一个QSound对象,完了再调用play函数来播放音频。

QSound bells("mysounds/bells.wav");
bells.play();

这个类我没有具体使用过,其他的信息也没有啥有价值的经验分享。但是我在扒拉这个类的时候,发现了一个应该可以解决我问题的新类,如下图

image-20221215203955633

它说,如果我想更好的控制播放声音,请考虑QSoundEffect或者QAudioOutput;QAudioOutput咱没用过,但是QSoundEffect看着比较对口味。所以我有扒拉了扒拉QSoundEffect

3 QSoundEffect

This class allows you to play uncompressed audio files (typically WAV files) in a generally lower latency way, and is suitable for “feedback” type sounds in response to user actions (e.g. virtual keyboard sounds, positive or negative feedback for popup dialogs, or game sounds). If low latency is not important, consider using the QMediaPlayer class instead, since it supports a wider variety of media formats and is less resource intensive.

这个官方描述中就直接说了,此类允许您以通常较低的延迟方式播放未压缩的音频文件(通常是 WAV 文件),并且适用于响应用户操作的“反馈”类型声音(例如虚拟键盘声音、弹出对话框的正面或负面反馈,或 游戏声音)。 如果低延迟不重要,请考虑改用 QMediaPlayer 类,因为它支持更广泛的媒体格式并且占用资源更少。

所以这会终于找对了。

 QSoundEffect effect;
 effect.setSource(QUrl::fromLocalFile("engine.wav"));
 effect.setLoopCount(QSoundEffect::Infinite);
 effect.setVolume(0.25f);
 effect.play();

用法基本大差不差,

第一行,新建一个QSoundEffect对象;

第二行,设置资源文件路径;

第三行,设置循环次数(这里就是无限循环);

第四行,设置音量,这里要看下,和前面的数量级不一样,这个是0-1;

第五行,播放音频

这个代码改完了,在项目中使用还是有不错的效果的,建议有遇到的小伙伴,可以尝试一下。

4 QAudioOutput

You can construct an audio output with the system’s default audio output device. It is also possible to create QAudioOutput with a specific QAudioDeviceInfo. When you create the audio output, you should also send in the QAudioFormat to be used for the playback (see the QAudioFormat class description for details).

这个更没有使用过了,不过看文档描述,感觉这个应该是更接近底层的播放类,可以设置更多的音频参数,官方描述说是:您可以使用系统默认的音频输出设备构建音频输出。 也可以使用特定的 QAudioDeviceInfo 创建 QAudioOutput。 创建音频输出时,还应发送用于播放的 QAudioFormat(有关详细信息,请参阅 QAudioFormat 类描述)。和面有用到再做详细解释。

官方示例代码如下:

 QFile sourceFile;   // class member.
 QAudioOutput* audio; // class member.
 {
     sourceFile.setFileName("/tmp/test.raw");
     sourceFile.open(QIODevice::ReadOnly);

     QAudioFormat format;
     // Set up the format, eg.
     format.setSampleRate(8000);
     format.setChannelCount(1);
     format.setSampleSize(8);
     format.setCodec("audio/pcm");
     format.setByteOrder(QAudioFormat::LittleEndian);
     format.setSampleType(QAudioFormat::UnSignedInt);

     QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
     if (!info.isFormatSupported(format)) {
         qWarning() << "Raw audio format not supported by backend, cannot play audio.";
         return;
     }

     audio = new QAudioOutput(format, this);
     connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
     audio->start(&sourceFile);
 }

博客签名2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的tree命令原来用处那么大,涨知识了!

大家应该熟悉或了解 Linux 中的目录结果&#xff0c;它就像树的根。这正是 tree 命令的概念。它以树状方式显示当前目录及其子目录的内容。 在使用 tree 命令之前&#xff0c;需要首先安装。 安装 tree 大多数 Linux 发行版中都没有预安装 tree 命令&#xff0c;但是可以在官…

XSS Game通关教程

12.XSS Game通关教程 1、Ma Spaghet! 审查源码 一个不安全的方式&#xff0c;直接get传输somebody 输入123看看位置 ?somebody123 如下 用下input标签即可 <input onmouseoveralert(1)>当鼠标移动到输入框时触发弹窗 2、Jefff 传入的jeff在eval里&#xff0c;那就…

MySQL(二)

schema与数据类型优化 数据类型的优化 更小的通常更好 应该尽量使用可以正确存储数据的最小数据类型&#xff0c;更小的数据类型通常更快&#xff0c;因为它们占用更少的磁盘、内存和CPU缓存&#xff0c;并且处理时需要的CPU周期更少&#xff0c;但是要确保没有低估需要存储的…

项目管理:产品新人常犯的四个错误

作为产品经理&#xff0c;在刚进入职场的时候总会遇到各种各样的困难&#xff0c;产品小白常犯的错误&#xff1a; 1、拿到需求就开始写方案 很多新人在接到一个需求时&#xff0c;常常犯的错误就是直接开始写产品需求文档。很多时候我们的需求来自于老板或者甲方&#xff0c;…

LeetCode-350. 两个数组的交集 II

目录方法一&#xff1a;哈希表方法二&#xff1a;排序 双指针题目来源 350. 两个数组的交集 II 方法一&#xff1a;哈希表 由于同一个数字在两个数组中都可能出现多次&#xff0c;因此需要用哈希表存储每个数字出现的次数。对于一个数字&#xff0c;其在交集中出现的次数等于…

看板:自我管理的高效工具!

当在团队中在做看板管理的时候&#xff0c;我们一直强调的是看板中的工作项需要承载价值。通过拉动承载价值的工作项在看板中的流动&#xff0c;我们可以清晰地看到产品价值从需求端流动到交付端的进展及状态。也正因如此&#xff0c;我们需要及时识别看板中没有价值的工作项并…

解锁极狐GitLab 自动化功能:Webhook 触发 Pipeline 与计划流水线

本文来自&#xff1a; 杨洪丽 极狐GitLab 高级网站可靠性工程师(SRE) 只使用极狐GitLab 存放代码? 那你就 OUT 啦&#xff01; 如果你也遇到了如图 A / B / C / D 各位同学的烦恼&#xff0c;不要错过这篇能够让你日常工作更高效的内容。 使用极狐GitLab Webhook 触发 Pipelin…

JSON格式店铺商品列表api

对于做竟店分析来说&#xff0c;首先要知道店铺有哪些商品&#xff0c;店铺宝贝列表则提供了这样的入口&#xff0c;可以查看该店铺的所有宝贝&#xff0c;也可以通过关键词全局搜索来获取店铺宝贝&#xff0c;但搜索会夹带这很多推荐的结果在里面&#xff0c;会比较混乱。 淘宝…

Python语言零基础入门教程(二)

Python 变量类型 变量是存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此&#xff0c;变量可以指定不同的数据类型&#xff0c;这些变…

2023年不良资产项目尽调研究报告

第一章 不良资产的尽调方法 1.1 档案查阅 阅档是尽职调查工作的第一步也是最基础的环节。阅档过程是对资产进行了解的过程&#xff0c;阅档需要判断债权是否具有瑕疵&#xff0c;担保是否继续有效&#xff0c;初步了解各类资产所含的法律关系、状态、权益等。 通过查阅项目卷…

AI人工智能方向

AI人工智能方向 图像CV 图像处理&#xff0c;犬类识别&#xff0c;场景文字识别&#xff0c;人脸算法&#xff0c;图像增强&#xff0c;计算机影像&#xff0c;车型识别&#xff0c;物体检测&#xff0c;黄色图片识别&#xff0c;目标检测API文档Logo检测使用手册&#xff0c…

【数字孪生百科】每周认识一个数字孪生要素 —— 气泡图(Bubble Chart)

简介气泡图&#xff08;Bubble Chart&#xff09;是一种多变量的图片&#xff0c;是散点图的一种变体&#xff0c;气泡图其实是在散点图的基础上进行升级改造的&#xff0c;在原有的以横纵坐标为变量的基础上&#xff0c;引入第三个变量&#xff0c;用气泡的大小来表示&#xf…

Lesson 5. 分类模型决策边界与模型评估指标(上)

文章目录一、决策边界&#xff08;Decision Boundary&#xff09;基本概念与用途1. 决策边界基本概念与绘制方法2. 通过决策边界观察模型性能3. 逻辑回归决策边界与模型可解释性二、逻辑回归决策边界绘制与使用方法1. 定义决策边界绘制函数2. 决策边界绘制3. 逻辑回归决策边界与…

3、Maven——Maven创建java web工程,IDEA更改XML版本、Maven Search插件的安装与使用

目录 一、Maven创建java web工程 二、Maven创建java web项目的结构 1、添加项目目录 2、web.xml配置处理报错 三、IDEA更改XML版本 四、Maven Search插件的安装与使用 1、Maven Search的安装 2、Maven Search的使用 一、Maven创建java web工程 创建Empty Project空工程…

【U8+】用友U8试算UFO报表后,显示#公式错误;并且函数向导中没有用友账务函数。

【问题描述】 使用用友U816.1软件的时候&#xff0c; 打开UFO报表&#xff0c;计算资产负债表后&#xff0c;显示【#公式错误】。 【排查过程】 开始以为是选择的报表模板文件有问题&#xff0c;将其文件发送到其他U8客户端电脑上&#xff0c;操作正常。 那么可以认为报表模板…

java vector 类

目录 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 1.1.3Vector类详细规则 1.2Vector与ArrayList的区别 二.Vector的方法 三.代码示例(demo) 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 Vector类 是在 java 中可以实现…

从0到1一步一步玩转openEuler--02 openEuler操作系统的安装

2 openEuler操作系统的安装 2.1 openEuler操作系统的安装流程 2.2 openEuler操作系统的安装详细步骤 本次介绍 openEuler 22.03-LTS 基于 X86 架构的安装。 2.2.1 下载地址 官网下载地址&#xff1a;https://www.openeuler.org/zh/download/ 根据你的实际需求选择适合架构…

提取游戏《碧蓝档案》(Blue Archive)内的素材

实际上你游素材直接去根目录下找就行&#xff0c;唯一需要处理的可能就是bgm&#xff08;格式均为ogg&#xff09;&#xff0c;用格式工厂或者你下个VLC都行。 使用方法&#xff1a;一根usb数据线&#xff0c;一台电脑&#xff0c;一部手机 目录 游戏目录位置 附录 更新&a…

SpringBean生命周期

IOC 控制反转 既然叫反转&#xff0c;肯定就有正转&#xff0c;正转其实就是对象去找实例&#xff0c;而反转就反过来了嘛&#xff0c;让实例来找对象通过容器&#xff1b; DI 依赖注入 通过容器注入了bean对象&#xff0c;而且这个过程是自动化的&#xff0c;也就是说容器…

计算机视觉

什么是计算机视觉&#xff1f; 计算机视觉是人工智能&#xff08;AI&#xff09;的一个领域&#xff0c;它使计算机和系统能够从数字图像、视频和其他视觉输入中提取有意义的信息&#xff0c;并根据该信息采取行动或提出建议。如果AI使计算机能够思考&#xff0c;那么计算机视…