基於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次圍觀