栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

使用QT开发的简易音乐播放器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用QT开发的简易音乐播放器

项目地址

项目简介:

自己用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);
};

实现效果:
(左下角播放列表的列表那只是一个占位符,待实现)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号