[專案地址] (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):顧名思義,就是整個播放器的主視窗,負責用戶與播放器的互動,繼承于QMianWindow,
播放串列模塊(PlayListView):主視窗上的播放串列,繼承于QListView,
滑動條模塊(PlayerSlider):主視窗上的播放進度條與音量進度條,繼承于QSlider,
播放按鈕模塊(PlayerButton):主視窗上的各種播放器控制元件,如開始、停止按鈕等,繼承于QLabel,
實作效果:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/480150.html
標籤:其他
上一篇:方法(Java)
下一篇:大一上C語言基礎筆記
