基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:点击为我投票
文章目录
- 1.实现音频文件对话框(QFileDialog类)
- 2.实现音乐播放(QMediaPlayer类/QMediaPlaylist类)
- 3.实现进度条更新以及文件时长显示
- 4.存在BUG
完整项目已上传GitHub,需要自行下载
1.实现音频文件对话框(QFileDialog类)
和其他应用程序一样,我们希望通过点击文件并打开文件对话框,选择要播放的音频文件,下面我们来实现它。
在ui界面拖一个按钮,并将其text改为添加音频,鼠标右击转到槽,选择clicked()并单击,在生成的槽函数中加入下列代码。
别忘了添加必要的头文件:#include<QFileDialog> 和 #include<QDir>
MainWindow.cpp
void MainWindow::on_pushButton_clicked()
{QString curPash =QDir::currentPath();QString dlgTitle="选择音频文件";QString filter="音频文件(*.mp3 *.wav *.wma)mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)";QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);if(fileList.count()<1)return;for(int i = 0;i<fileList.count();i++){//ui->plainTextEdit->appendPlainText(fileList.at(i));//将选择的文件显示在文本框上}
}
知识点讲解:
QString curPash = QDir::currentPath();
获取应用程序当前的目录,也就是当前exe所在目录,可也自行设定。QString dlgTitle=“选择音频文件”;
文件对话框的标题。QString filter=“音频文件(.mp3 .wav .wma)mp3文件(.mp3);;wav文件(.wav);;wma文件(.wma);;所有文件(.)”;
用于设置文件过滤,每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。getOpenFileNames( this, “Select one or more files to open”,"/home",“Images (*.png *.xpm *.jpg)”);
该函数用于选择打开多个文件,拥有4个参数,需要传递的是后三个参数,分别是对话框标题(dlgTitle),初始化目录(curPash )以及文件过滤器(filter)。返回值为选择文件的带路径的完整文件名,对应的getOpenFileName()函数用于选择并打开一个文件。选择多文件还是单文件,视具体情况而定。
利用创建QFileDialog文件框完成,效果如下:
2.实现音乐播放(QMediaPlayer类/QMediaPlaylist类)
首先在.h中定义播放器和播放列表,然后在.cpp中实现音乐播放。
别忘了在 .pro文件添加 QT += multimedia 注意QT全部大写,然后继续添加头文件
#include<QtMultimedia/QMediaPlayer> 和 #include<QtMultimedia/QMediaPlaylist>
MainWindow.h
//类中添加
class MainWindow : public QMainWindow
{Q_OBJECT
private:QMediaPlayer * player;QMediaPlaylist * playlist;
private:Ui::MainWindow *ui;
};
MainWindow .cpp
//构造函数中添加player = new QMediaPlayer(this);playlist = new QMediaPlaylist(this);playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式player->setPlaylist(playlist);//获取将播放列表要播放的文件
///
//添加音频文件 槽函数添加如下代码,上面出现的代码已省略for(int i = 0;i<fileList.count();i++){QString aFile = fileList.at(i);playlist->addMedia(QUrl::fromLocalFile(aFile));QFileInfo fileInfo(aFile);//ui->listWidget->addItem(fileInfo.fileName()); //用于显示//ui->plainTextEdit->appendPlainText(fileList.at(i)); //用于显示}if(player->state()!=QMediaPlayer::PlayingState){playlist->setCurrentIndex(0);}player->play();
知识点讲解:
playlist->addMedia(QUrl::fromLocalFile(aFile));
通过循环,将文件添加到playlist播放器列表。QFileInfo fileInfo(aFile);
获取文件的相关信息,例如文件名等等。if(player->state()!=QMediaPlayer::PlayingState)
{
playlist->setCurrentIndex(0);
}
player->state()会返回当前播放器的状态,:PlayingState(值为1)为播放中状态,对应的还有StoppedState(值为0)空闲状态,PausedState(值为2)播放暂停状态。然后setCurrentIndex()用于设置当前播放列表的序号。player->play();
播放音乐,对应的还有pause()暂停音乐,stop()关闭音乐。
3.实现进度条更新以及文件时长显示
在ui界面拖入Horizontal Bar进度条和tabel(显示文件时长)
添加相关定义和自定义的槽函数:
mainwindow.h
//类中添加
private:
QString durationTime;
QString positionTime;
private slots:
void onDurationChanged(qint64 duration); //文件时长变化,更新当前播放文件名显示
//播放文件数据总大小的信号, 它可以获得文件时间长度。
void onPositionChanged(qint64 position); //当前文件播放位置变化,更新进度显示
//播放到什么位置的信号, 参数是以毫秒来计算的。
mainwindow.cpp
//构造函数中添加
//通过播放器发出的信号调用自定义槽函数 信号是播放器自动触发
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(onPositionChanged(qint64)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(onDurationChanged(qint64)));
//外面添加
void MainWindow::onDurationChanged(qint64 duration)
{ui->horizontalSlider->setMaximum(duration); //设置进度条最大值 也就是歌曲时长 msint secs = duration/1000; //全部秒数int mins = secs/60;//分secs = secs % 60;//秒durationTime = QString::asprintf("%d:%d",mins,secs);ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::onPositionChanged(qint64 position)
{if(ui->horizontalSlider->isSliderDown())return;//如果手动调整进度条,则不处理ui->horizontalSlider->setSliderPosition(position);int secs = position/1000;int mins = secs/60;secs = secs % 60;positionTime = QString::asprintf("%d:%d",mins,secs);ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{player->setPosition(value);//文件播放位置 根据进度条传入的参数
}
效果如下:
4.存在BUG
1.进度条每次移动一段,而不是匀速移动。
2.在音乐播放中发现存在卡顿情况,将进度条删除,则流畅运行,应该是单线程的问题,更新进度条导致了音乐播放期间的卡顿。
这次就更新到这里,下一期更新暂停,切换歌曲,声音以及移动窗口,还有最重要的修复BUG!!
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条相关推荐
- 本地服务器的音乐如何才能播放视频文件夹,mx播放器如何添加本地文件 添加本地文件设置方法...
更换播放器皮肤/主题颜色 在这个版本中 主题颜色的设置十分丰富 不再拘泥于原来的黑白二色 点击"设置"选择"列表"项 修改主题,选择一种自己喜欢的颜色 现在有十 ...
- android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...
Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...
- html音乐播放器进度条同步,网页音乐播放器完整版特效,自行控制,带进度条...
WWW.51JS.COM---[94OK] //---------这是区分播放器的音乐类型,你可以填加修改------// var RS = new Array("rm",&quo ...
- 基于qt开发的智能系统:电子相册,监控摄像头模块,音乐播放器,视频播放器,电子时钟
登录模块 源码请移步 //登录验证按钮函数 void MainWindow::on_loginBtn_clicked() {//获得userNameLEd输入框的文本userNameLEd->t ...
- pyqt5+pygame实现音乐播放器,可以自动提取文件图片,最终版本
pyqt5+pyagme实现音乐播放器,运用了pyqt5的list,可以双击播放,会自动提取音频文件的图片 源码下载**:自己往下翻**!!!,(但如果你想用积分下载我也拦不了你) https://d ...
- 基于QT开发的多媒体播放器
基于QT开发的多媒体播放器 描述: 使用QT软件设计一个多媒体播放器,实现视频及音乐的播放,暂停,快进,快退,音量的调整. 歌词的实时显示和视频全屏播放等基本功能. 功能: 1.音乐系统:提供播放.暂 ...
- 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- html音乐播放器样式,html5扁平化mp3音乐播放器样式代码
特效描述:html5 扁平化mp3 音乐播放器样式.扁平风格的简易的mp3音乐播放器样式代码.html5 mp3音乐播放器 代码结构 1. 引入JS 2. HTML代码 0:00 0:00 'use ...
- 基于QT的游戏修改器
基于QT的游戏修改器 本项目是一个可以修改部分游戏的部分数据的.例如:修改自己做的贪吃蛇的得分. 1.h代码 #pragma once#include <QtWidgets/QMainWindo ...
最新文章
- shell脚本中常见的一些特殊符号和作用详解
- 【RAC】 RAC For W2K8R2 安装--共享磁盘的配置(三)
- java.sql.SQLException: Column ‘class‘ not found.异常没有找到列
- 【数据平台】Centos下仅CPU安装TensorFlow
- 5、【设计模式】单列模式
- C#判断一个类中有无指定名称的方法
- 博阅电纸书_【博阅电纸书】博阅 M1 柠檬电纸书阅读器评测,博阅T62电纸书评测_什么值得买...
- 【Flink】Flink常量UDF-TableFunction优化
- oc_转_类的数组的实现和操作
- vant 项目_基于 vue3.x+vant3.x 搭建示例项目
- 3元购买微信小程序解决方案一个月
- hdu3787 A+B
- nosql数据库MongoDB的用法
- 国内先进的光电转换器件设计和单光子检测成像技术 1DTof 3DTof 激光测距传感器
- CS231n 计算机视觉(学习笔记)第一章(0723)
- 淘宝用户行为分析——用户画像
- 惠普服务器关机自动重启,惠普电脑关机后自动重启怎么解决
- 水浊度传感器( ADC 代码详解)
- (转)python基础之迭代器协议和生成器(一)
- Python查询天数
热门文章
- 数字电视技术英文专业词汇释义
- 论CyberVein在新型智慧城市建设中的应用现状,让智慧城市不再“乌托邦”
- 因明生物在港交所IPO招股书“失效”:亏损飙升,黄明国为董事长
- Elementary OS常见软件(TIM、微信、企业微信)安装(二)
- 2020年直播电商数据报告_抖音VS快手
- 【转载】网络工程师面试常问
- 环境变量,系统变量与用户变量
- opencv-膨胀 dilate()
- 160824华为Mate7创建一键锁屏快捷方式
- kubernetes ingress路由配置http body大小限制,访问k8s服务的时候报错:413 Request Entity Too Large