QT 단순 음악 재생 기 구현

24412 단어 QT플레이어
QT 기반 다기 능 미디어 재생 기 를 구현 합 니 다.오디 오(예:mp3),비디오 를 재생 할 수 있 습 니 다.
미디어 플레이어 인터페이스,진도 바 가 있 습 니 다.총 재생 시간,현재 재생 시간 을 보 여 줍 니 다.진도 바 는 드래그 할 수 있 습 니 다.재생,일시 정지 키 가 있 고 빠 른 속도,빠 른 속도 키 가 있 습 니 다.지난 곡 의 다음 곡,음소 거,볼 륨 조절,더 블 클릭 으로 노래 를 재생 하고 간단 한 가 사 를 동기 화 할 수 있 습 니 다.
메 인 화면 은 다음 과 같 습 니 다:

뮤 직 비디오,가사,음악 파일 을 각각 저장 하 는 로 컬 폴 더 세 개 를 만 듭 니 다.




프로젝트 구조 디 렉 터 리 는 다음 과 같 습 니 다.

mainwindow.h 코드 는 다음 과 같 습 니 다.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QMediaPlayer>
#include <QStringList>
#include <QDir>
#include <QTime>
#include <QTimer>
#include<videoplayer.h>
#include<videoplayer_qr.h>
#include<videoplayer_cq.h>

QT_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:\\Users\\44637\\Music\\QTMusic";
  QString LrcPath="C:\\Users\\44637\\Music\\QTLrc";

  QStringList fileList;  //    
  QStringList lrcList;
  QMediaPlaylist *PlayerList;
  QMediaPlayer *Player;
  int  moved;
  int iCount=0;
  QTimer *timer2;
  QMap<int, QString> map;
  QMap<QString, QString> *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 <QDebug>
#include <QFile>
#include <QTextStream>
#include <QTextCodec>

MainWindow::MainWindow(QWidget *parent)
  : QMainWindow(parent)
  , ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotButtonStart);
  connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotButtonLast);
  connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotButtonNext);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::changestartbutton);
  connect(ui->Buttonvideo_wm,&QPushButton::clicked,this,&MainWindow::video_click_wm);
  connect(ui->Buttonvideo_qr,&QPushButton::clicked,this,&MainWindow::video_click_qr);
  connect(ui->Buttonvideo_cq,&QPushButton::clicked,this,&MainWindow::video_click_cq);
  connect(ui->Buttonmute,&QPushButton::clicked,this,&MainWindow::mute);
  connect(ui->fastButton,&QPushButton::clicked,this,&MainWindow::fastForward);
  connect(ui->fastbackButton,&QPushButton::clicked,this,&MainWindow::fastBack);
  init();
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::init(){
  button_style();

  PlayerList = new QMediaPlaylist;  //           
  Player = new QMediaPlayer;
  fileList = getFileNames(this->MusicPath);  //            
  lrcList = getLrcNames(this->LrcPath);
  moved = 0;
  qDebug()<<"ALL Music File 
"<<fileList; qDebug()<<"ALL Lrc File
"<<lrcList; for(int i=0;i<fileList.size();i++){ QString fileName=fileList.at(i); addItem(fileName); PlayerList->addMedia(QUrl::fromLocalFile(MusicPath+"\\"+fileName)); } PlayerList->setCurrentIndex(0); Player->setPlaylist(PlayerList); // connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentMusic); connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentLrc); connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::cleanmap); connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc); connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc); connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc); connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentMusic); connect(ui->Volumebar, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int))); connect(Player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChange(qint64))); connect(Player,SIGNAL(durationChanged(qint64)),this,SLOT(musicTime())); connect(ui->Progressbar,SIGNAL(sliderMoved(int)),this,SLOT(seekChange(int))); connect(ui->musicname,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(playto(int,int))); } QStringList MainWindow::getFileNames(const QString &path) { QDir dir(path); QStringList nameFilters; nameFilters << "*.mp3"; QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name); return files; } QStringList MainWindow::getLrcNames(const QString &path) { QDir dir(path); QStringList nameFilters; nameFilters <<"*.txt"; QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name); return files; } void MainWindow::addItem(QString name){ int count = ui ->musicname->rowCount(); ui->musicname->setRowCount(count+1); QTableWidgetItem *itemName = new QTableWidgetItem(name); itemName->setFlags(itemName->flags() & ~Qt::ItemIsEditable); ui->musicname->setItem(count,0,itemName); } void MainWindow::slotShowCurrentMusic(){ int index=PlayerList->currentIndex(); QString songName=fileList.at(index); ui->CurrentMusic->setText(songName); } void MainWindow::slotShowCurrentLrc(){ int index=PlayerList->currentIndex(); qDebug()<<index; QString musicLrc=lrcList.at(index); qDebug()<<musicLrc; initlrc(musicLrc); } void MainWindow::slotButtonStart(){ if(!isPlay){ isPlay=true; Player->setVolume(100); Player->play(); musicTime(); } else{ isPlay=false; Player->pause(); musicTime(); } } void MainWindow::slotButtonLast(){ int currentIndex = PlayerList->currentIndex(); if(currentIndex == 0){ currentIndex=PlayerList->mediaCount(); } else{ PlayerList->previous(); PlayerList->previousIndex(); musicTime(); } } void MainWindow::slotButtonNext(){ int currentIndex = PlayerList->currentIndex(); if(++currentIndex == PlayerList->mediaCount()){ currentIndex=0;} PlayerList->setCurrentIndex(currentIndex); musicTime(); } void MainWindow::volumChange(int vol) { Player -> setVolume(vol); } void MainWindow::positionChange(qint64 position) { ui->Progressbar->setMaximum(Player->duration() / 1000);// .00 ui->Progressbar->setValue(position / 1000);// , moved = position;// ( ) QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);// ui->showPro ->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; showWord(time); } void MainWindow::seekChange(int position) { Player -> setPosition(position * 1000);// , moved = position * 1000;// ( ) QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);// ui->showPro ->setText(moveTime.toString("mm:ss"));// } void MainWindow::musicTime(){ qint64 time = Player->duration(); QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000); ui->MusicTime->setText(Time.toString("mm:ss")); qDebug()<<"time:"<<Time; } void MainWindow::showWord(int time) { if(map.contains(time)) { ui->label1->setText(map.value(time)); } else{ qDebug()<<" "; } } void MainWindow::getHeader(const char *str, QString &des) { des = des.remove(str); des = des.remove("]"); } void MainWindow::getTime(QString line)// lrc { if(line.startsWith("[")) { int index = line.indexOf("]"); QString t = line.mid(1, index - 1); 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; t = line.mid(index + 1); index = t.lastIndexOf("]"); if(index < 0) { map.insert(time, t); } else { t = t.mid(index + 1); map.insert(time, t); getTime(t); qDebug()<<"time123:"<<time; } } } void MainWindow::initlrc(const QString& fileName) { QMap<int, QString> map; QString l; QFile file("C:\\Users\\44637\\Music\\QTLrc\\"+fileName); if(file.exists()){ qDebug()<<" "; } else{ qDebug()<<" "; } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ return; } QTextCodec *codec = QTextCodec::codecForName("GBK"); while(!file.atEnd()) { QString line = codec->toUnicode(file.readLine()); QString s(line); if(s.length()<4) continue; if(s.startsWith("[ti:")) { getHeader("[ti:", s); map.insert(0, s); ui->topmusicname->setText(s); continue; } else if(s.startsWith("[ar:")) { getHeader("[ar:", s); map.insert(1000, s); ui->singer->setText(" :"+s); continue; } else if(s.startsWith("[al:")) { getHeader("[al:", s); map.insert(2000, s); ui->album->setText(" :"+s); continue; } else if(s.startsWith("[by:")) { getHeader("[by:", s); map.insert(3000, s); continue; } else { getTime(s); } } file.close(); } void MainWindow::button_style(){ ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg")); ui->Buttonlast->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\last.jpg")); ui->Buttonnext->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\
ext.png")); ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg")); ui->Buttonvideo_qr->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png")); ui->Buttonvideo_wm->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png")); ui->Buttonvideo_cq->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png")); } void MainWindow::changestartbutton(){ if(isPlay) ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg")); else ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg")); } void MainWindow::cleanmap(){ map.clear(); } void MainWindow::playto(int i,int ) { PlayerList->setCurrentIndex(i); isPlay=true; changestartbutton(); QString musicLrc=lrcList.at(i); initlrc(musicLrc); Player->play(); } void MainWindow::video_click_wm(){ v1= new VideoPlayer(this); v1->setModal(false); v1->show(); } void MainWindow::video_click_qr(){ v_qr= new videoplayer_qr(this); v_qr->setModal(false); v_qr->show(); } void MainWindow::video_click_cq(){ v_cq= new videoplayer_cq(this); v_cq->setModal(false); v_cq->show(); } void MainWindow::mute(){ if(!ismute){ Player -> setVolume(0); //ui->voiceslider->value(); ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\mute.png")); ismute=true; } else{ Player -> setVolume(100); ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg")); ismute=false; } } void MainWindow::fastForward(){ qint64 position=Player->position(); qDebug()<<"position"<<position; position=position+5000; ui->Progressbar->setValue(position/1000); Player -> setPosition(position);// , } void MainWindow::fastBack(){ qint64 position=Player->position(); qDebug()<<"position"<<position; position=position-5000; ui->Progressbar->setValue(position/1000); Player -> setPosition(position);// , }
videoplayer.h 코드 는 다음 과 같 습 니 다.

#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H

#include <QDialog>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMediaPlaylist>
#include <QTime>
#include <QTimer>

namespace 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 <QDebug>
#include <QFile>
#include <QCloseEvent>

VideoPlayer::VideoPlayer(QWidget *parent) :
  QDialog(parent),
  ui(new Ui::VideoPlayer)
{
  ui->setupUi(this);
  qDebug()<<"     ";
  connect(ui->Buttonstart,&QPushButton::clicked,this,&VideoPlayer::changestartbutton);
  connect(ui->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:\\Users\\44637\\Music\\MV\\   -  MV.mp4"));
  player->setPlaylist(playlist);

  QFile file("C:\\Users\\44637\\Music\\MV\\   -  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"<<time;
}

void VideoPlayer::seekChange(int position)
{
  player -> setPosition(position * 1000);//        ,       
  moved = position * 1000;//           (  )
  QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//    
}

void VideoPlayer::videoTime(){

        qint64 time = player->duration();
        QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000);
          ui->videotime->setText(Time.toString("mm:ss"));
        qDebug()<<"time:"<<Time;
}


void VideoPlayer::changestartbutton(){
  if(!isPlay_wm)
  ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg"));
  else
  ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg"));
}

void VideoPlayer::button_style(){
  ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg"));
  ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
}

void VideoPlayer::mute(){
  if(!ismute){
  player -> setVolume(0);
  ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\mute.png"));
  ismute=true;
  }
  else{
  player -> setVolume(100);
  ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
  ismute=false;
  }
}
전체 운행 인 터 페 이 스 는 다음 과 같다.


몇 가지 관건 적 인 방법 과 사고방식:
(1)노래 가 져 오기:
로 컬 파일 에서 노래 이름과 노래의 가 사 를 가 져 오고 파일 경로 에 있 는 모든 음악 파일 과 가사 파일 을 가 져 와 두 개의 QStringList 형식의 목록 을 생 성 합 니 다.동시에 노래 이름 을 표시 하 는 구성 요소 에 추가 합 니 다.재생 기와 재생 목록 을 예화 하여 재생 목록 에 항목 별로 불 러 오고 재생 목록 을 재생 기 에 불 러 옵 니 다.
(2)음악,영상 진도 표:
슬라이더 의 길이 범 위 를 음악 길이 0.001 배 로 설정 하고 음악 진도 가 바 뀌 면 슬라이더 의 위 치 를 동시에 바 꾸 고 슬라이더 가 위 치 를 바 꾸 면 음악 진 도 를 바꾼다.재생 시간 을 음악 진행(밀리초)과 같이 설정 하고 Qlabel 구성 요소 로 표시 합 니 다.
(3)가 사 를 나타 낸다.😂)
mp3 가사 파일 은 lrc 를 확장자 로 하 는 파일 로 일반 텍스트 형식 파일 에 속 하 며,mp3 일반 텍스트 형식의 가사 파일("XXX.lrc")을 분석 하여 가사의 동기 화 디 스 플레이 를 실현 합 니 다.
LRC 가 사 는'[:]'형식의'태그(tag)',일반 텍스트 에 기반 한 가사 전용 형식 이다.
라벨 은'표지 라벨'과'시간 라벨'두 가지 로 나 뉘 는데 아래 ①~⑤ 는'표지 라벨',⑥ 는'시간 라벨'이다.
①[ti:곡 명]
②[아 티 스 트 명]
③[al:앨범 명]
④[by:편집자(LRC 가 사 를 편집 하 는 사람 을 말한다)]
⑤[offset:시간 보상 치]단 위 는 밀리초 이 고 전체 가 앞 당 겨 지고 마이너스 가 반대 임 을 나타 낸다.디 스 플레이 의 속 도 를 전체적으로 조정 하 는 데 사용 합 니 다.
⑥ 가사 내용
괄호 안에 노래 내용 이 표 시 될 때의 시작 시간 입 니 다.":"앞 은 분 입 니 다.":"뒤 는 초 입 니 다.그 중에서"."앞 은 초 입 니 다."."뒤 는 리 초(1 초의 1%)입 니 다.중 괄호 밖 에는 가사 내용 이 있다.
음악 이름 에 해당 하 는 가사 파일 을 읽 고 가 사 를 한 줄 씩 읽 고 QMap 형식 으로 저장 하 며 탭 마다 시작 부분 에 키 값 이 다 릅 니 다.
각 탭 의 시간 을 가 져 와 시간 과 해당 하 는 가 사 를 키 쌍 으로 QMap 에 저장 합 니 다.
가 사 를 표시 합 니 다.현재 시간 을 매개 변수 로 입력 하고 시간 에 대응 하 는 값 을 읽 습 니 다.
저 는 QT 를 처음 배 웠 습 니 다.최선 을 다 했 지만 잘 하지 못 하 는 부분 이 많 습 니 다.그리고 방법 과 생각 을 한 후에 보충 하 겠 습 니 다.
동 영상 을 재생 하 는 데 bug 가 있 는 것 같 습 니 다.화면 이 너무 못 생 겨 서 가사 가 스크롤 되 지 않 고 현재 재생 되 고 있 는 가사 만 표시 할 수 있 습 니 다.토론 과 지 도 를 바 랍 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기