Qt程序添加音乐和音效,解决QtCreator中给程序添加音乐失败的问题
最近写了个Qt小游戏,希望添加个背景音乐,却失败了很多次,下面总结一下经验。
添加音乐或者音效一般需要使用multimedia库。
首先在pro文件中添加QT += multimedia
然后我们可以使用QSound类或者QMediaPlayer类来添加音乐。
方式1:注意该方式中QSound中的音乐格式是wav,而不是mp3,mp3格式在此方式中无法播放,如果是多次调用某音效就使用该方式。
#include <QSound>
QSound *startsound=new QSound(":/qss/backgroundmusic.wav",this);
startsound->play(); //播放
startsound->setLoops(-1);//循环次数,-1代表一直循环
方式2:该方式更适合添加背景音乐。
#include <QMediaPlayer>
QMediaPlayer *startSound; //创建一个音乐播放器
//connect(startSound,SIGNAL(positionChanged(qint64)),this,SLOT(postitionChanged(qint64)));
startSound>setMedia(QUrl::fromLocalFile("C:\\Users\\TuZhou\\Desktop\\music.wav");
startSound->setVolume(80); //音量
startSound->play();
请注意该方式中我的音乐路径和方式1中的路径有什么不同吗?
对滴,方式1中音乐路径用的是resources文件中copy来的路径,而方式2中的路径是电脑中的文件路径,前面这个fromLocalfile是从电脑本地寻找文件,该方式中你可以使用绝对路径,也可以使用相对路径,但是不能使用resources中copy来的路径,而且使用\需要用两个\,不然会被当成转义字符导致出错。
如果你想使用resources中copy来的路径,可以这么改:
#include <QMediaPlayer>
QMediaPlayer *startSound; //创建一个音乐播放器
//connect(startSound,SIGNAL(positionChanged(qint64)),this,SLOT(postitionChanged(qint64)));
startSound>setMedia(QUrl("qrc:/new/sound/sounds/music.mp3");
startSound->setVolume(80); //音量
startSound->play();
删除fromLocalFile函数,直接使用QUrl()函数转换路径,此时你在resources中copy的路径为:
此时无法使用电脑本地的路径,只能用resources中的路径。
什么?你说你不会添加resources文件?
那行吧,我说下。
先右键项目Add New文件,选择Qt模板中的Resource File。
然后点击Resources下qrc文件界面中的添加前缀然后点击添加文件。
前缀名可以更改,也可以不改。
添加文件时选中你需要的音乐文件打开即可。
不过你要提前把音乐文件放在你项目文件夹中。
然后最后右键项目点击构建然后点击qmake就好了。
方式3:如果你想循环播放某音乐,或者是添加多首音乐播放。
#include <QMediaPlaylist>
#include <QMediaPlayer>
QMediaPlayList *musicList = new QMediaPlayList(this); //添加音乐列表
musicList->addmeida(QUrl("qrc:/new/sound/sounds/backmusic.mp3")) //添加音乐列表
musicList->addMedia(QUrl("qrc:/new/sound/sounds/di.wav"));
musicList->addMedia(QUrl("qrc:/new/sound/sounds/gameover.mp3"));
musicList->addMedia(QUrl("qrc:/new/sound/sounds/music.wav"));
QMidiaPlayer *soundPlayer = new QMediaPlayer(this); //创建音乐播放器
soundPlayer->setPlaylist(musicList); //设置音乐列表
soundPlayer->Play();
//以上会使音乐顺序播放
//如果只有一首音乐,同样添加到musicList中,再添加一条
musicList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); //循环播放
//这样就可以单首音乐循环播放