概述
目录
前言
一、随意听音乐闹钟是什么?
二、效果图
三、源码
1.下载歌曲
2.播放
四、源码地址
前言
办公室中午午休结束闹铃,每次都需要手动去选择一首喜欢的歌曲,然后点击播放,一首歌放完,再关闭播放器,十分麻烦。我希望有一款播放器能设定定时播放,播放内容就是一首随机歌曲,然后我查询市面主流播放器,都无此功能,即使有定时,也只支持播放指定的播放列表中文件,并且还不能限制仅播一首,为什么没有呢,难道我的需求很奇葩。。。
作为程序员的我,怎能忍受,说干就干。。。
一、随意听音乐闹钟是什么?
- 他是一个闹钟程序,目前仅做了PC版
- 这个闹钟到点后会去网上随机下载一首歌曲,然后播放,播放结束
二、效果图
使用方法:
- 启动软件,默认自动开机启动
- 直接修改你需要的闹钟时间
- 开始享受吧
三、源码
1.下载歌曲
去哪里下载歌曲,是本软件最大的难点,好人再这里,感谢UomgAPI提供API支持。
UomgAPI主页:https://api.uomg.com
网易云音乐随机歌曲下载API:https://api.uomg.com/doc-rand.music.html
有了API的加持,下载就很容易了,该软件默认获取网易云音乐热播榜歌曲
注意,在歌曲下载的时候,url被重定向了,我们需要手动处理下,篇幅有限,代码就只贴部分关键代码,下面会给源码地址,开源
bool RandomMusicClock::getMusic()
{
QNetworkRequest request;
request.setUrl(QUrl("http://api.uomg.com/api/rand.music?sort=热歌榜&format=json"));
m_getMusicReply = m_pManager->get(request);
connect(m_getMusicReply, SIGNAL(finished()), this, SLOT(sltHttpFinished()));
return true;
}
bool RandomMusicClock::startDownloadFile()
{
QDir dir;
dir.mkpath(m_strSaveDir);
m_strFilePath = m_strSaveDir + "/" + m_strName + ".mp3";
m_pFile = new QFile(m_strFilePath);
if (!m_pFile->open(QIODevice::WriteOnly))
{
insertLog(QString("创建文件失败 %1").arg(m_strFilePath));
delete m_pFile;
m_pFile = NULL;
return false;
}
m_url = QUrl::fromUserInput(m_strUrl);
QNetworkRequest request;
request.setUrl(m_url);
m_downloadReply = m_pManager->get(request);
connect(m_downloadReply, SIGNAL(finished()), this, SLOT(sltHttpFinished()));
connect(m_downloadReply, SIGNAL(readyRead()), this, SLOT(sltHttpReadyRead()));
connect(m_downloadReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(sltHttpError(QNetworkReply::NetworkError)));
//connect(m_downloadReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(sltDownloadProgress(qint64, qint64)));
return true;
}
void RandomMusicClock::sltHttpFinished()
{
QNetworkReply* reply = (QNetworkReply*)sender();
if (reply == m_downloadReply)
{
if (m_pFile)
{
m_pFile->flush();
m_pFile->close();
delete m_pFile;
m_pFile = NULL;
}
const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
reply->deleteLater();
reply = nullptr;
if (!redirectionTarget.isNull())
{
const QUrl redirectedUrl = m_url.resolved(redirectionTarget.toUrl());
QFile file(m_strFilePath);
if (file.exists())
{
file.remove();
}
m_strUrl = redirectedUrl.toString();
startDownloadFile();
return;
}
else
{
playUrl(m_strFilePath);
}
}
else if (reply == m_getMusicReply)
{
if (reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
reply->deleteLater();
reply = nullptr;
if (!parseMusic(bytes))
{
return;
}
insertLog("开始下载歌曲文件");
if (!startDownloadFile())
{
return;
}
}
else
{
reply->deleteLater();
reply = nullptr;
insertLog(QString("获取音乐信息失败,错误码:%1").arg((int)reply->error()));
return;
}
}
else
{
reply->deleteLater();
reply = nullptr;
}
}
void RandomMusicClock::sltHttpReadyRead()
{
if (m_pFile)
{
m_pFile->write(m_downloadReply->readAll());
}
}
2.播放
MP3文件播放就是有qt的QMediaPlayer即可。比较容易,qt的官方示例中也有比较完整的例子,我的播放代码基本都来源于qt官方示例。上代码,
void RandomMusicClock::playUrl(const QUrl &url)
{
insertLog("播放歌曲");
ui.toolButton_play->setEnabled(true);
if (url.isLocalFile()) {
const QString filePath = url.toLocalFile();
ui.label_info->setText(QDir::toNativeSeparators(filePath));
m_strFileName = QFileInfo(filePath).fileName();
} else {
ui.label_info->setText(url.toString());
m_strFileName.clear();
}
if (m_mediaPlayer.state() == QMediaPlayer::PlayingState)
m_mediaPlayer.stop();
m_mediaPlayer.setMedia(url);
m_mediaPlayer.play();
}
四、源码地址
https://gitee.com/redchairman/random-music-clock.git
git里有windows安装包,可以直接下载安装使用
最后
以上就是善良花生为你收集整理的QT实战项目 - 随意听音乐闹钟前言一、随意听音乐闹钟是什么?二、效果图三、源码四、源码地址的全部内容,希望文章能够帮你解决QT实战项目 - 随意听音乐闹钟前言一、随意听音乐闹钟是什么?二、效果图三、源码四、源码地址所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复