##什麼是方法? ###基本介紹 在其他語言中也叫函數 System.out.println();類名.對象.方法; Java方法是語句的集合,它們在一起執行一個功能 方法是解決一類問題的步驟的有序集合 方法包含於類或者方法中 方法在程式中被創建,在其他地方被引用 設計方法的原則:方法的本意是功能塊 ...
[項目地址] (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。
實現效果: