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


简介

使用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,然后清除并重新构建。

总结

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿里等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:Qt麦克风数据探测、FFmpeg解码音频数据、音频波形图、音频播放器。具体内容包括:1.Qt采集麦克风并探测数据,生成动态矩形图。2.FFMpeg解码音频数据,生成PCM数据,并绘制波形图。3.音频播放器实战。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。
Qt是一个跨平台的图形用户界面(GUI)开发工具集,可以用来开发各种应用程序,包括音视频播放器。 QMediaPlayerQt中的一个多媒体播放类,可以用来播放音频和视频文件。基于QMediaPlayer,我们可以开发一个功能完善的音视频播放器。 首先,我们可以使用QMediaPlayer提供的功能来实现基本的音视频播放控制,包括播放、暂停、停止、快进、快退等。我们可以通过按钮、菜单或者快捷键来触发相应的操作,或者可以根据用户的输入来实现自动播放和暂停。 其次,我们可以通过QMediaPlayer的信号和槽机制来实现一些附加功能。例如,当播放器播放完一个文件时,我们可以发出一个信号来通知用户,或者自动切换到下一个文件。我们还可以监听播放器的状态变化,例如播放、暂停、停止等,以便更新界面和提供相应的反馈信息。 此外,我们还可以使用QMediaPlayer的媒体查询功能来获取音视频文件的元数据,例如时长、作者、标题等信息,以及获取当前播放位置和进度。我们可以将这些信息显示在界面上,让用户获得更好的使用体验。 除了以上功能,我们还可以使用Qt提供的其他模块来增加更多的特性。例如,我们可以使用Qt Multimedia模块的QAudioProbe来实现音频波形显示,使用Qt MultimediaWidgets模块的QVideoWidget来实现视频播放区域,使用Qt Widgets模块的QSlider来实现音视频进度条等。 总之,基于QMediaPlayer的开发,我们可以轻松实现一个功能完善的音视频播放器,满足用户对于音视频播放的基本需求,并且具备一定的扩展性,可以根据实际需求进行功能扩展和自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰封的雪绒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值