[项目地址] (https://github.com/Remaker01/TinyPlayer)
项目简介:
自己做的一个小项目,GUI界面使用的是Qt5.12,播放模块一开始使用Qt自带的multimedia模块,后改为VLC-qt以支持更多格式。
主要有主窗口(Playerwindow),播放器核心(PlayerCore),播放列表(PlayList),播放器控件(PlayButton),音乐文件信息(Music)等模块。
可以支持打开文件夹并自动搜索合法音频文件,还可以拖拽文件到界面上。可以保存播放列表。
目前界面比较丑,后期可能会美化界面,还可能加入网络音乐播放功能之类的。
分模块介绍:
音乐信息模块:存放音频文件信息,包括时长、标题、专辑等。
类定义:
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:
/**
* 根据指定的URL建立音乐对象
* @param uri 给定的URL
* @note 本构造函数**不会**判断URL是否合法
*/
Music(const QUrl &uri = QUrl());
///获取包含标题、时间、唱片集、描述的音乐信息
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);
}
friend uint qHash(const Music &key,uint seed = 0) {
return qHash(key.title,seed) ^ qHash(key.length,seed) ^ qHash(key.url.fileName(),seed);
}
///获取Url
const QUrl &getUrl() const;
///获取经格式化后的时间
QString formatTime();
static Music getMediaDetail(const QString &fileName);
static bool isLegal(QString media);
};
播放器核心模块:其实就是对VlcMediaPlayer的一些封装与扩展
类定义:
class PlayerCore : public VlcMediaPlayer{
Q_OBJECT
private:
static VlcInstance *ins;
VlcMedia *curMedia;
QSet<Music> medias; //去重用
QList<QUrl> list;
int current = -1;
int startLoc = 0;
void connectSlots();
void setMedia(const QString &media,bool start = true);
public:
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);
///获取当前媒体
QString getMedia();
///获取指定编号的媒体目录
QString 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();
void play();
~PlayerCore();
signals:
void finished();
//void mediaSourceChanged(qint64 newTime);
};
主窗口模块(PlayerWindow):顾名思义,就是整个播放器的主窗口。负责用户与播放器的交互。继承于QMainWindow。
播放列表模块(PlayListView):主窗口上的播放列表,继承于QListView。
滑动条模块(PlayerSlider):主窗口上的播放进度条与音量进度条,继承于QSlider。
播放按钮模块(PlayerButton):主窗口上的各种播放器控件,如开始、停止按钮等。继承于QLabel。
实现效果: