使用Qt制作的简易音乐播放器

使用Qt制作的简易音乐播放器

[项目地址] (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.cnblogs.com/m0-51303687/archive/2022/05/22/16298363.html