基于QT的QMediaPlayer生成的音频播放器

文章目录

  • 简介
  • 一、效果展示
  • 二、功能说明
    • 1.选择文件
    • 2.点击列表获取音频信息,并进行播放
    • 3.拖动滑块,选择播放进度
    • 4.播放暂停与继续
    • 5.上一首和下一首
    • 6.顺序播放
    • 7.单曲循环
    • 8.用到的槽函数
  • 三、务必留意
  • 四、可能出现的错误
  • 总结


简介

使用Qt5.10.0中的多媒体模块,生成了一个简单的音乐播放器,功能简单粗糙,可能存在bug ,额,存在一些特色,还请谅解并告知,非常感谢!
(请务必在pro文件中加上multimedia,如果还需要使用QVedioWidget还请加上multimediawidgets,即QT += core gui multimedia multimediawidgets
传送门:基于Qt的QMediaPlayer生成的音乐播放器


一、效果展示

选择文件目录基于QT的QMediaPlayer生成的音频播放器_第1张图片
音频播放基于QT的QMediaPlayer生成的音频播放器_第2张图片

二、功能说明

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
基于QT的QMediaPlayer生成的音频播放器_第3张图片
2.运行时提示QMediaPlayer和QVedioWidget"no such file"的,请务必确认在pro工程文件中添加了模块multimedia 和multimediawidgets,然后清除并重新构建。

总结

一个简单的音乐播放器!然后,感谢您的浏览!!!

你可能感兴趣的:(qt,音视频,数据库)