文章目录
简介
使用Qt5.10.0中的多媒体模块,生成了一个简单的音乐播放器,功能简单粗糙,可能存在bug ,额,存在一些特色,还请谅解并告知,非常感谢!
(请务必在pro文件中加上multimedia,如果还需要使用QVedioWidget还请加上multimediawidgets,即QT += core gui multimedia multimediawidgets
)
传送门:基于Qt的QMediaPlayer生成的音乐播放器
一、效果展示
选择文件目录
音频播放
二、功能说明
1.选择文件
点击【选择音频文件】选择文件夹打开所有的mp3,m4a,flac,wav类型的音频文件,并将其存放到QListWidget中。
void MusicPlayer::slot_selectFile()
{
//打开目录,获取目录或文件
// fileName = QFileDialog::getOpenFileName(this,"选择音频文件","E:/Music","music(*.mp3);;movie(*.mp4)");
fileName = QFileDialog::getExistingDirectory(this,"选择文件夹","E:/Music");
if(!fileName.isEmpty())
{
//设置文件类型过滤
QDir dir(fileName);
QStringList filters;
filters<<"*.mp3"<<"*.mp4"<<"*.m4a"<<"*.wav"<<"*.flac";
dir.setNameFilters(filters);
//每次选择目录都会清空当前listwidget数据
ui->musicList->clear();
//遍历list获取过滤后的每一个文件名,放到listwidget中
fileList = dir.entryInfoList();
for(int i=0;i<fileList.size();i++)
{
QString filename = fileList[i].fileName();
ui->musicList->addItem(filename);
}
}
//当列表中无文件数据时禁止按钮点击
if(fileList.count()>=1)
{
ui->player->setEnabled(true);
ui->pause->setEnabled(true);
ui->preview->setEnabled(true);
ui->next->setEnabled(true);
ui->order->setEnabled(true);
ui->loop->setEnabled(true);
}
else
{
ui->player->setEnabled(false);
ui->pause->setEnabled(false);
ui->preview->setEnabled(false);
ui->next->setEnabled(false);
ui->order->setEnabled(false);
ui->loop->setEnabled(false);
}
}
2.点击列表获取音频信息,并进行播放
选择列表中的音频,点击播放音频
//获取文件名称
void MusicPlayer::slot_getInfo(QListWidgetItem* item)
{
//获取音频文件名称
musicUrl = fileName + "/" +item->text();
}
//等待音频加载完成,并初始化时间label
void MusicPlayer::loadMusic()
{
//等待音频加载结束
while(player->mediaStatus()!=QMediaPlayer::LoadedMedia)
{
int ms = 100;
QEventLoop loop;
QTimer::singleShot(ms, &loop, &QEventLoop::quit);
loop.exec();
}
qint64 duration = player->duration();
int minutes = duration / 60000;
int remainSecond = (duration % 60000)/1000;
//初始化进度条
formattedTime = QString("%1:%2").arg(minutes,2,10,QChar('0')).arg(remainSecond,2,10,QChar('0'));
ui->timeCount->setText(QString("00:00/%1").arg(formattedTime));
player->play();
sortFlag = false;
qDebug()<<duration<<musicUrl<<formattedTime;
}
//播放音频
void MusicPlayer::slot_playMusic()
{
if(!musicUrl.isEmpty())
{
//获取音频时长
player->setMedia(QUrl::fromLocalFile(musicUrl));
loadMusic();
}
}
3.拖动滑块,选择播放进度
拖动左下角滑块,切换音频播放时间,音频将从选择的时间段继续播放
//设置滑块的进度条范围
void MusicPlayer::slot_durationChanged(qint64 duration)
{
ui->musicBar->setRange(0,duration);
}
//拖动滑块,修改音频播放位置
void MusicPlayer::slot_valueChanged(int value)
{
player->setPosition(value);
}
//更新音频当前时间
void MusicPlayer::slot_positionChanged(qint64 position)
{
ui->musicBar->setValue(position);
int minutes = position / 60000;
int seconds = (position%60000)/1000;
ui->timeCount->setText(QString("%1:%2/%3").arg(minutes,2,10,QChar('0')).arg(seconds,2,10,QChar('0')).arg(formattedTime));
}
4.播放暂停与继续
音频的暂停与继续
void MusicPlayer::slot_pause()
{
if(player->state() == QMediaPlayer::PlayingState)
{
player->pause();
ui->pause->setText("继续播放");
}
else if(player->state() == QMediaPlayer::PausedState)
{
player->play();
ui->pause->setText("暂停播放");
}
}
5.上一首和下一首
点击【上一首】或【下一首】切换音频播放,并将正在播放的音频在列表中选中
//上一首
void MusicPlayer::slot_preview()
{
m_index = ui->musicList->currentRow()-1;
if(m_index == -1)
m_index = fileList.size()-1;
//将ListWidget中上一首进行选中,第一首会跳到最后一首
ui->musicList->setCurrentRow(m_index);
//获取上一首音频的文件名称
musicUrl = fileName + "/" +ui->musicList->item(m_index)->text();
slot_playMusic();
}
//下一首
void MusicPlayer::slot_next()
{
m_index = ui->musicList->currentRow()+1;
if(m_index >= fileList.size())
m_index = 0;
//将ListWidget中下一首进行选中,最后一首点击时重头开始
ui->musicList->setCurrentRow(m_index);
//获取下一首音频的文件名称
musicUrl = fileName + "/" +ui->musicList->item(m_index)->text();
slot_playMusic();
}
6.顺序播放
//顺序播放,只会将列表中当前选择的项以及后面的项依次进行播放
void MusicPlayer::slot_sortPlay()
{
m_index = ui->musicList->currentRow();
QMediaPlaylist* playlist = new QMediaPlaylist;
playlist->setPlaybackMode(QMediaPlaylist::Sequential);
qDebug()<<m_index;
for(int i = m_index+1;i<=fileList.size();i++)
{
ui->musicList->setCurrentRow(m_index);
musicUrl = fileName + "/" +ui->musicList->item(i-1)->text();
QUrl fileUrl = QUrl::fromLocalFile(musicUrl);
playlist->addMedia(fileUrl);
}
player->setPlaylist(playlist);
loadMusic();
sortFlag = true;
}
7.单曲循环
//单曲循环
void MusicPlayer::slot_loopPlay()
{
QMediaPlaylist* playlist = new QMediaPlaylist;
playlist->setPlaybackMode(QMediaPlaylist::Loop);
musicUrl = fileName + "/" +ui->musicList->currentItem()->text();
QUrl fileUrl = QUrl::fromLocalFile(musicUrl);
playlist->addMedia(fileUrl);
player->setPlaylist(playlist);
loadMusic();
}
8.用到的槽函数
void MusicPlayer::initConnect()
{
connect(ui->select,SIGNAL(clicked()),this,SLOT(slot_selectFile()));
connect(ui->player,SIGNAL(clicked()),this,SLOT(slot_playMusic()));
connect(ui->musicList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(slot_getInfo(QListWidgetItem*)));
// connect(ui->musicBar,SIGNAL(valueChanged(int)),this,SLOT(slot_valueChanged(int)));
connect(ui->musicBar,SIGNAL(sliderMoved(int)),this,SLOT(slot_valueChanged(int)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(slot_durationChanged(qint64)));
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(slot_positionChanged(qint64)));
connect(ui->pause,SIGNAL(clicked()),this,SLOT(slot_pause()));
connect(ui->preview,SIGNAL(clicked()),this,SLOT(slot_preview()));
connect(ui->next,SIGNAL(clicked()),this,SLOT(slot_next()));
connect(ui->order,SIGNAL(clicked()),this,SLOT(slot_sortPlay()));
connect(ui->loop,SIGNAL(clicked()),this,SLOT(slot_loopPlay()));
connect(player,SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),this,SLOT(slot_mediaStatus(QMediaPlayer::MediaStatus)));
}
三、务必留意
1.左下角的列表和QSlider之间其实有两个label的,一个在前面显示正在播放的音乐信息,一个在后面显示音频的当前时间和总时长。但,前面的那个label忘记做了。。。如果有强迫症的那你自己加上哈!
2.正常点击一首音乐,然后点击播放音频,只会播放这一首音乐,播放完毕后当前时间等于总时长,然后再去拖动进度条是不会再播放啦!想再次播放就只能手动点击列表然后点击播放音频了。
3.顺序播放会将当前选择的音乐,以及后面所有音乐都加入到一个QMediaPlayerList然后顺序播放这些音乐。
4.没做视频播放功能,需要使用QVideoWidget
,可能Qt版本不同这个类也不同,Qt版本比较老的好像没这个类,总的来说就是定义一个QVideoWidget
对象然后把它加到窗口中,然后player->play()前将那个对象show()出来。
四、可能出现的错误
1.播放m4a,flac类型时出错并提示
DirectShowPlayerService::doRender: Unresolved error code 0x80040266 (),请务必下载一个解码器并放到Qt的根目录下。解码器官网:LAVFilters-0.65
2.运行时提示QMediaPlayer和QVedioWidget"no such file"的,请务必确认在pro工程文件中添加了模块multimedia 和multimediawidgets,然后清除并重新构建。
总结
一个简单的音乐播放器!然后,感谢您的浏览!!!