项目地址
项目简介:自己用C With Class C++做的一个小项目,GUI界面使用的是Qt5.12,播放模块一开始使用Qt自带的multimedia模块,后改为VLC-qt以支持更多格式。
功能特点与展望:
支持打开文件夹并自动搜索合法音频文件(暂不支持递归搜索),还可以拖拽文件到界面上。
支持mp3,wav,aiff,flac,aac,wma六种格式,后期如果有时间可能还会加。
支持简单的播放列表。可以保存、加载播放列表。也支持下次启动时自动装入上次退出时的播放列表。后期将加入多个播放列表的支持。
目前界面比较丑,后期可能会美化界面,还可能加入网络音乐播放功能之类的功能。
分模块介绍:音乐信息模块:实现存放音乐信息,并具有对文件合法性的简单判断功能。
类定义:
class Music {
private:
QString formattedTime;
const QUrl url;
int length;
QString title,description,album;
static bool isMP3(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);
public:
Music(const QUrl &uri = QUrl());
///获取包含标题、时间、唱片集、描述的音乐信息
QString toString();
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);
}
friend uint qHash(const Music &key,uint seed = 0) {
return qHash(key.title,seed) ^ qHash(key.length,seed);
}
///获取Url
const QUrl &getUrl() const;
///获取经格式化后的时间
QString formatTime();
static Music getMediaDetail(const QString &fileName);
static bool isLegal(QString media);
};
UI模块,包括主窗口模块和自定义控件模块。
主窗口(Playerwindow)模块就是整个播放器的主窗口。模块负责用户与播放器的交互。继承于QMainWindow。
自定义控件模块,包括播放列表(PlayListView),播放器控件(PlayerButton),进度条(PlayerSlider)。分别继承于QListView,QLabel,QSlider,为适应功能需求进行了扩展。
播放器核心模块(PlayerCore)继承于VlcMediaPlayer,其实就是对VlcMediaPlayer的一些封装与扩展。内部有一个静态VlcInstance对象,不同player之间共享。
类定义:
class PlayerCore : public VlcMediaPlayer{
Q_OBJECT
private:
static VlcInstance inst;
VlcMedia *curMedia;
QSet medias; //去重用
QList 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 = 6;
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);
///获取当前媒体
QUrl getMedia();
///获取指定编号的媒体目录
const QUrl &getMedia(int i);
///获取媒体详细信息
Music getMediaDetail(int i);
///获取以秒为单位的时间
int getPosInSecond();
int getCurrentMediaIndex();
///设置时间,以秒为单位
void setPos(int pos);
///设置播放列表位置
void setCurrentMediaIndex(int i);
///添加到播放列表
bool addToList(const QString &media);
///从播放列表中移除
bool removeFromList(int loc);
///清空播放列表
void clear();
~PlayerCore();
public slots:
void play();
void pause();
void goNext();
void goPrevious();
signals:
void finished();
//void mediaSourceChanged(qint64 newTime);
};
实现效果:
(左下角播放列表的列表那只是一个占位符,待实现)



