项目地址

项目简介:

自己用C With Class C++做的一个小项目,GUI界面使用的是Qt5.12,播放模块一开始使用Qt自带的multimedia模块,后改为VLC-qt以支持更多格式。
本项目主要用于学习目的,需要的可以借鉴,也欢迎提出意见和建议。
功能特点与展望:
支持打开文件夹并自动搜索合法音频文件(暂不支持递归搜索),还可以拖拽文件到界面上。

支持多种格式。

支持简单的播放列表。可以保存、加载播放列表。也支持下次启动时自动装入上次退出时的播放列表。后期或将加入多个播放列表的支持。

目前界面比较丑,后期可能会美化界面,还可能加入网络音乐播放功能之类的功能。

分模块介绍:

音乐信息模块:实现存放音乐信息,并具有对文件合法性的简单判断功能。
类定义:

class Music {private:QString formattedTime;QUrl url;//歌曲名QString title,description,album;QUrl albumImage;int length;static bool isMPEG(QFile *media,QDataStream &reader);static bool isWav(QFile *media,QDataStream &reader);static bool isWma(QFile *media,QDataStream &reader);static bool isAiff(QFile *media,QDataStream &reader);static bool isFlac(QFile *media,QDataStream &reader); static bool isAAC(QFile *media,QDataStream &reader);static bool isM4A(QFile *media,QDataStream &reader);static bool isAPE(QFile *media,QDataStream &reader);static bool isVorbis(QFile *media,QDataStream &reader);static bool isAU(QFile *media,QDataStream &reader);
public:/*** 根据指定的URL建立音乐对象* @param uri 给定的URL* @note 本构造函数**不会**判断URL是否合法*/Music(const QUrl &uri = QUrl());Music(const Music &a) = default;///获取包含标题、时间、唱片集、描述的音乐信息QString toString();/*** 比较两个Music是否相等* @param a 另一个Music* @return 当且仅当满足以下条件之一时返回true:* 1.url相同* 2.长度,标题均相同*/bool equals(const Music &a) const;friend bool operator==(const Music &a,const Music &b) {return a.equals(b);}friend bool operator!=(const Music &a,const Music &b) {return !a.equals(b);}//hash相同,可能不同,但若hash不同,则认为一定不同friend uint qHash(const Music &key,uint seed = 0) {return qHash(key.title,seed) ^ qHash(key.length,seed);}//getters///获取Urlconst QUrl &getUrl() const;/// 获取标题const QString &getTitle() const;/// 获取介绍const QString &getDcrp() const;/// 获取专辑图片 注意:可能不准const QUrl &getAlbumImage() const;///获取经格式化后的时间QString formatTime();/*** @brief 检查文件是否合法* @param media  被检查的文件名。* @return 当文件>1KB且符合任意一种支持的格式时,返回true,否则返回false*/static bool isLegal(QString media);};
#endif // MUSIC_H

UI模块,包括主窗口模块和自定义控件模块。
主窗口(Playerwindow)模块就是整个播放器的主窗口。模块负责用户与播放器的交互。继承于QMainWindow。
自定义控件模块,包括播放列表(PlayListView),播放器控件(PlayerButton),进度条(PlayerSlider)。分别继承于QListView,QLabel,QSlider,为适应功能需求进行了扩展。

播放器核心模块(PlayerCore)继承于VlcMediaPlayer,其实就是对VlcMediaPlayer的一些封装与扩展。内部有一个静态VlcInstance对象,不同player之间共享。

类定义:

class PlayerCore : public VlcMediaPlayer{Q_OBJECT
private:static VlcInstance ins;VlcEqualizer *equ;VlcMedia *curMedia;QSet<Music> medias;QList<QUrl> list;int current = -1;int startLoc = 0;void connectSlots();void setMedia(const QString &media);
public:static constexpr int MAX_MEDIA_COUNT = 10000;static constexpr int MODE_COUNT = 4,FORMAT_COUNT = 16;static const QString Formats[FORMAT_COUNT];/// 各模式的提示文字static const QString MODE_TIPS[MODE_COUNT];/// 播放模式enum PlayMode{SIGNLE = 0,SEQUENTIAL,SIGNLE_LOOP,LIST_LOOP};PlayMode mode = SIGNLE;explicit PlayerCore(QObject *parent = nullptr);///获取当前媒体urlQUrl getMedia();///获取指定编号的媒体目录urlconst QUrl &getMedia(int i);///获取媒体详细信息Music getMediaDetail(int i);Music getMediaDetail();///获取以秒为单位的时间int getPosInSecond();int getCurrentMediaIndex();///设置时间,以秒为单位void setPos(int pos);///设置播放列表位置void setCurrentMediaIndex(int i);///添加到播放列表bool addToList(const QString &media,bool local = true);/*** 从播放列表中移除特定媒体* 若移除的是当前活动媒体,则自动将当前活动媒体设为上一个,如果同时是第一个则设为删除后的第一个(即原来的第二个)*/bool removeFromList(int loc);///清空播放列表void clear();bool isLocal(int i);~PlayerCore();
public slots:void play();void goNext();void goPrevious();/*** @brief moveUp 将指定媒体上移* @param i 要移动哪个媒体* @param k 移动多少个单位* @return 当i位置合法且移动后的位置仍合法,返回true,否则返回false* @note moveDown类似*/bool moveUp(int i,int k = 1);bool moveDown(int i, int k = 1);void setSoundEffect(uint index);
signals:void finished();//void mediaSourceChanged(qint64 newTime);
};

网络模块:支持网络音乐搜索、播放。实现搜索的核心采用python爬虫脚本实现,用pyinstaller编译成可执行文件后供C++调用,通过参数传递搜索关键词
爬虫的核心代码如下

host = "https://www.xzmp3.com"
pool = ThreadPool(20)
fp = open("links.tmp","w",encoding="utf-8")
# 第一步:获取下载页面的URLs
def get_downpage_list(name:str):search_page = host + "/xiazai/"uri = search_page + parse.quote(name) + ".htm"response = request.urlopen(request.Request(uri,headers=head,method="GET"))page_text = response.read().decode("utf-8")tree = etree.HTML(page_text)# html/body/div/div[2]/div/div[2](截止到这里是"body")/div[1]/div/div[3]/div[1]/div[i]/aresult = tree.xpath("//body/div/div[2]/div/div[2]//div[@class=\"list_row\"]")#print(result)#开始查找urlsurl_list = []for each in result:location = each.xpath("./div[1]/a/@href")title = each.xpath("./div[1]/a/text()")singer = each.xpath("./div[2]/a/text()")if len(location)>0:url_list.append(title[0] + ';' + singer[0] + ';' + host+location[0])for i in range(0,len(url_list),10):pool.map(get_downlink,url_list[i,min(len(url_list),i+10)]) # 分成10个1组pool.close()pool.join()
# 第二步:从获取到的URLs中提取实际下载地址,保存在文件中
def get_downlink(info:str):lst = info.split(';')response = request.urlopen(request.Request(url=lst[2],headers=head,method="GET"))page_text = response.read().decode("utf-8")tree = etree.HTML(page_text)result_addr = tree.xpath("//body/div/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[1]/a")# fp.write(result_addr[0].xpath("./@href")[0])response = request.urlopen(request.Request(url=result_addr[0].xpath("./@href")[0],headers=head,method="GET"))true_url = response.geturl()if(true_url.find(host) < 0 and (not true_url.endswith("/404"))):fp.write(lst[0] + ';' + lst[1] + ';' +  true_url + '\n')
if __name__ == "__main__":if len(sys.argv) < 2:fp.close()raise Exception("错误:未指定关键词")# st = time.time()get_downpage_list(sys.argv[1])# print(time.time() - st)fp.close()

实现效果:
(左下角为专辑图片)

初始界面

正在播放

拖拽

加载播放列表
8.20更新:支持网络音乐搜索和打开外部文件,效果如下:

9.20更新:更新代码
10.4更新:更新部分截图

使用QT开发的简易音乐播放器相关推荐

  1. 基于Android系统开发的简易音乐播放器

    大概做了一周左右,一个简易版本的音乐播放器.主要有三个界面,先上图: 一个主界面:主要负责1加载外部存储的音乐文件信息到应用内置数据库中2转到音乐文件列表界面 一个音乐文件列表界面:主要1负责展示音乐 ...

  2. Android开发之简易音乐播放器(一)

    这里介绍一个简易的音乐播放器, 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死, 但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主要存放在这一个文件中: ...

  3. 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

    typora-root-url: ./ [毕业设计]28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文) 文章目录 typora-root-url: ./ ...

  4. 利用Broadcast及相关组件实现简易音乐播放器功能

    目录 前言 项目源码 准备工作 代码编写 页面布局 Service类的创建 主函数的编写 项目心得 前言 在Andriod Studio中使用Broadcast实现了简易音乐播放器的功能.可以进行播放 ...

  5. 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  6. PyQt5实现简易音乐播放器

    PyQt5实现简易音乐播放器 环境 vscode python 3.10.0 PyQt5 5.15.4 功能目标 能够读取本地的音乐文件,并实现播放的开关.曲目的切换和音量的加减 具体实现 新建一个文 ...

  7. 好程序员前端分享使用JS开发简单的音乐播放器

    好程序员前端分享使用JS开发简单的音乐播放器,最近,我们在教学生使用JavaScript,今天就带大家开发一款简单的音乐播放器.首先,最终效果如图所示: 首先,我们来编写html界面index.htm ...

  8. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)

    JavaScript + Audio API自制简易音乐播放器(详细完整版) ** 音乐播放器的功能清单如下: ** 1.点击暂停按钮,歌曲暂停 2.点击播放按钮,歌曲播放 3.单曲循环与取消单曲循环 ...

  9. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  10. html实现简易音乐播放器

    目标: 使用vue.js导包的形式做一个简单的音乐播放器,新手也很容易看懂. 内容: 1. 使用了flex实现响应式布局: 2. 使用min-width防止字体被压缩: 3. 使用computed计算 ...

最新文章

  1. wxWidgets:向后兼容
  2. 10.Vue 组件基础
  3. python连接数据库mysql错误1045_django 连接数据库出现1045错误的解决方式
  4. log4j2 mysql_spring boot使用log4j2将日志写入mysql数据库
  5. 【Java】转置String的各种方法分析
  6. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题
  7. Inject Dll 过程
  8. 每一个tab切换的都是一个新的组件刷新
  9. 笑出腹肌的程序猿搞笑趣图
  10. 基于android课设报告,基于android的简单用户注册系统课程设计报告.doc
  11. Java获取本机ip地址的代码
  12. Pycharm画图中文显示报错:UserWarning: Glyph 20013 (\N{CJK UNIFIED IDEOGRAPH-4E2D}) missing from current font.
  13. 盛迈坤电商:拼多多推广数据多久会显示
  14. [人生故事] -- 花朵静悄悄地开放
  15. 使用switchshow/supportshow命令确认Brocade交换机型号(转载)
  16. 旋转卡壳简介(POJ2187)(洛谷P1452)
  17. qlv,qsv,kux格式转换成MP4格式软件
  18. 洛谷P1309 瑞士轮【归并排序】
  19. 解决android studio编译的速度慢,安装apk过慢的问题
  20. UPC2020寒假训练第一场

热门文章

  1. 搞定检索式对话系统的候选response检索--使用pysolr调用Solr
  2. 中国茶道的基本精神(转)
  3. Android学习日记(yzy):Fragment与VierPager简单实现
  4. 圣诞邀请助力活动H5系统开发
  5. 渗透之SQL注入-MYSQL常用语法
  6. PayPal社交游戏及移动娱乐产业的海外商机
  7. 腾讯游戏客户端一面准备
  8. C++编译错误总结及其英文翻译————墨白
  9. 51单片机定时器/计数器
  10. 户口迁移一定要本人去办理的吗???