歡迎您光臨本站 註冊首頁

QT實現簡單音樂播放器

←手機掃碼閱讀     madbeef @ 2020-07-01 , reply:0

基於QT實現一個多功能媒體播放器,它能播放音訊(如mp3),影片
 媒體播放器介面,有進度條,可展示總播放時間、當前播放時間,進度條可拖動,有播放、暫停鍵,有快進、快退鍵,上一曲下一曲,靜音,調節音量,雙擊播放歌曲,以及簡單的歌詞同步。
 主介面如下:

建立三個本地資料夾分別存放MV,歌詞和音樂檔案
 
 
 
 
 

工程結構目錄如下(整個結構沒有設計好,所以每個影片都要單獨建立檔案):

mainwindow.h程式碼如下:

  #ifndef MAINWINDOW_H  #define MAINWINDOW_H    #include#include#include#include#include#include#include#include#include#include#includeQT_BEGIN_NAMESPACE  namespace Ui { class MainWindow; }  QT_END_NAMESPACE    class MainWindow : public QMainWindow  {    Q_OBJECT    public:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();    private:    Ui::MainWindow *ui;    VideoPlayer *v1;    videoplayer_qr *v_qr;    videoplayer_cq *v_cq;      bool isPlay=false;    bool ismute=false;    QString MusicPath="C:Users44637MusicQTMusic";    QString LrcPath="C:Users44637MusicQTLrc";      QStringList fileList;  //檔名稱    QStringList lrcList;    QMediaPlaylist *PlayerList;    QMediaPlayer *Player;    int  moved;    int iCount=0;    QTimer *timer2;    QMapmap;    QMap*map2;    void getHeader(const char *str, QString &des);    void getTime(QString line);//改動二      private slots:    void init();//初始化    void addItem(QString name); //把歌名新增到musicname上    QStringList getFileNames(const QString &path); //獲取路徑下所有檔名     QStringList getLrcNames(const QString &path); //獲取路徑下所有檔名    void slotButtonStart();//播放    void slotButtonLast();//上一首    void slotButtonNext();//下一首    void slotShowCurrentMusic();//顯示當前播放的歌曲    void volumChange(int);//控制音量    void positionChange(qint64 position);//進度條隨著音樂播放變化    void seekChange(int position); //滑動滑動條快進、倒退音樂,且音樂已播放時長也跟著變化    void musicTime();//歌曲總時間    void slotShowCurrentLrc();    void showWord(int time);//顯示歌詞    void initlrc(const QString& fileName);//初始化歌詞    void button_style();//按鈕樣式    void changestartbutton();    void cleanmap();    void playto(int i,int );//雙擊播放    void video_click_wm();//播放相應影片    void video_click_qr();    void video_click_cq();    void mute();//靜音    void fastForward();//快進    void fastBack();//快退    };  #endif // MAINWINDOW_H

 

mainwindow.cpp程式碼如下:

  #include "mainwindow.h"  #include "ui_mainwindow.h"  #include

 

videoplayer.h程式碼如下(影片播放和音樂播放差不多):

  #ifndef VIDEOPLAYER_H  #define VIDEOPLAYER_H    #include#include#include#include#include#includenamespace Ui {  class VideoPlayer;  }    class VideoPlayer : public QDialog  {    Q_OBJECT    public:    explicit VideoPlayer(QWidget *parent = nullptr);    ~VideoPlayer();    public slots:    void init();    void slotButtonStart();    void slotstop();    void closeEvent(QCloseEvent *);    void volumChange(int);    void positionChange(qint64 position);    void seekChange(int position); //滑動滑動條快進、倒退音樂,且音樂已播放時長也跟著變化    void videoTime();    void changestartbutton();    void button_style();    void mute();    private:    QMediaPlayer* player;    QVideoWidget* videoWidget;    QMediaPlaylist* playlist;    Ui::VideoPlayer *ui;    bool isPlay_wm=false;    bool ismute=false;    int  moved;    };    #endif // VIDEOPLAYER_H

 

videoplayer.cpp程式碼如下:

  #include "videoplayer.h"  #include "ui_videoplayer.h"  #include#include#includeVideoPlayer::VideoPlayer(QWidget *parent) :    QDialog(parent),    ui(new Ui::VideoPlayer)  {    ui->setupUi(this);    qDebug()Buttonmute,&QPushButton::clicked,this,&VideoPlayer::mute);    init();    connect(ui->Buttonstart,&QPushButton::clicked,this,&VideoPlayer::slotButtonStart);    connect(ui->voiceSlider, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int)));    connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChange(qint64)));    connect(ui->timeSlider,SIGNAL(sliderMoved(int)),this,SLOT(seekChange(int)));    connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(videoTime()));  }    VideoPlayer::~VideoPlayer()  {    slotstop();    delete ui;  }    void VideoPlayer::init(){    //widget=new QWidget;    button_style();    player= new QMediaPlayer;    videoWidget=new QVideoWidget;    playlist=new QMediaPlaylist;    playlist->clear();    playlist->addMedia(QUrl::fromLocalFile("C:Users44637MusicMV陳奕迅-我們MV.mp4"));    player->setPlaylist(playlist);      QFile file("C:Users44637MusicMV陳奕迅-我們MV.mp4");    if(!file.open(QIODevice::ReadOnly))      qDebug() << "Could not open file";      player->setVideoOutput(videoWidget);    player->setPlaylist(playlist);    videoWidget->setAutoFillBackground(true);    QPalette qplte;    qplte.setColor(QPalette::Window, QColor(0,0,0));    videoWidget->setPalette(qplte);    ui->verticalLayout->addWidget(videoWidget);    player->play();    isPlay_wm=true;  }    void VideoPlayer::slotButtonStart(){      if(!isPlay_wm){      isPlay_wm=true;      //Player->setVolume(100);      player->play();      //musicTime();      //qApp->quit();      }    else{      isPlay_wm=false;      player->pause();      //musicTime();    }    }    void VideoPlayer::slotstop(){    player->stop();    playlist->clear();    //player->  }    void VideoPlayer::closeEvent(QCloseEvent *event){    slotstop();    event->accept();  }    void VideoPlayer::volumChange(int vol)  {    player -> setVolume(vol);  }    void VideoPlayer::positionChange(qint64 position)  {    ui->timeSlider->setMaximum(player->duration() / 1000);//設定滑塊的長度範圍為音樂長.00度    ui->timeSlider->setValue(position / 1000);//如果音樂進度改變,則改變滑塊顯示位置    moved = position;//讓播放時間等於音樂進度(毫秒)    QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設定時間    ui->currenttime ->setText(moveTime.toString("mm:ss"));//顯示時間    QString t=moveTime.toString("mm:ss");    QString mm = t.mid(0,2);    QString ss = t.mid(3, 2);    int m = mm.toInt();    int s = ss.toInt();    int time = m*60*1000 + s*1000;    qDebug()<<"int"duration();          QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000);            ui->videotime->setText(Time.toString("mm:ss"));          qDebug()<<"time:"setIcon(QIcon("E:QTQTcodeMusicPlayericonpause.jpg"));    else    ui->Buttonstart->setIcon(QIcon("E:QTQTcodeMusicPlayericonstart.jpg"));  }    void VideoPlayer::button_style(){    ui->Buttonstart->setIcon(QIcon("E:QTQTcodeMusicPlayericonpause.jpg"));    ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonvolume.jpg"));  }    void VideoPlayer::mute(){    if(!ismute){    player -> setVolume(0);    ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonmute.png"));    ismute=true;    }    else{    player -> setVolume(100);    ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonvolume.jpg"));    ismute=false;    }  }

 

總體執行介面如下:

一些關鍵方法和思路:

(1)匯入歌曲:
 從本地檔案將歌曲名和歌曲的歌詞匯入,獲取檔案路徑下所有的音樂檔案和歌詞檔案,生成兩個QStringList型別的列表。同時將歌名新增到顯示歌名的元件上。同時例項化播放器和播放列表,將列表逐項載入到播放列表上,並將播放列表載入到播放器上。
 

(2)音樂、影片進度條:

設定滑塊的長度範圍為音樂長0.001倍,如果音樂進度發生改變,則同時改變滑塊位置,如果滑塊改變位置,則改變音樂進度。同時設定時間,讓播放時間等於音樂進度(毫秒)並用Qlabel元件顯示。

(3)顯示歌詞:(個人覺得這是個最難的點,參考了大神的思路,加上自己的思考,搞了好久才搞出來


[madbeef ] QT實現簡單音樂播放器已經有470次圍觀

http://coctec.com/docs/program/show-post-240526.html