基于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!!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58010.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于QT的音乐播放器频谱实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、官方文档分析二、实现步骤1. 捕获原始音频数字信号2. 读取音频数据3. 计算FFT4. 项目源码目录5. 实际效果 总结 前言 网上的很多音乐播放器频谱实现&#…

A40i使用笔记:使用QT调用aplay播放wav音频/混音

一、前言 在linux当中播放音乐的方式有很多种&#xff0c;我使用的A40i核心板&#xff0c;是 aplay 指令&#xff0c;是 alsa 的一个指令&#xff0c;也就是说需要先安装有 alsa&#xff0c;使用其他arm开发板的小伙伴可以先自行安装alsa之后在进入正文&#xff0c;这里我没实…

音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二) https://blog.csdn.net/xiaolong1126626497/article/details/126973994 一、前言 在做音乐播…

QT音乐播放器2:切歌,暂停继续合一

1、实现切歌&#xff0c;循环播放 mainwindow.h private slots:void on_nextBt_clicked();void on_frontBt_clicked();在mainwindow.cpp中 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){//切歌存储歌单列表QFileInfoList infolist …

用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

一、前言 在用Qt写一个简单的音乐播放器&#xff08;一&#xff09;&#xff1a;使用QMediaPlayer播放音乐中&#xff0c;我们已经知道如何去使用QMediaPlayer播放音乐。 在用Qt写一个简单的音乐播放器&#xff08;二&#xff09;&#xff1a;增加界面&#xff08;开始和暂停音…

如何使用Guitar Pro在乐谱播放时切换效果器音色?

如何使用Guitar Pro在乐谱播放时切换效果器音色&#xff1f; 关键词&#xff1a;吉他谱 Guitar Pro是一款专注于多种乐器谱制作和播放的高效电脑系统软件&#xff0c;我们使用它可以完成非常多的乐谱操作&#xff0c;如乐队排练、和弦学习等适用于高手和新手的功能都不在话下…

qt 频谱 音乐播放器

先看效果 录制_2022_08_11_14_37_25_628 在网上找了一圈&#xff0c; 好多人写的资料敝竹自珍&#xff0c;还要收费真是无语。还有些需要用第三方库&#xff0c;真是没有必要。qt可以直接实现这些功能 音乐播放器的实现我就不贴了&#xff0c; 网上好多例子&#xff0c;我主要…

功能扩展——邮件发送、网页注册

邮件收发 转自这位大佬 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是smtp.xxx…

网站注册邮件发送功能实现

摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址&#xff1a;一般是 smtp…

阿里巴巴国际站获得商品详情 API 调用分享(销量、详情图片、宝贝链接)

item_get-获得商品详情 alibaba.item_get 调用代码分享 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; imp…

利用用户搜索词生成商品标题信息——阿里巴巴IDST

今天介绍的论文是阿里IDST在2018年AAAI上发表的paper《A Multi-task Learning Approach for Improving Product Title Compression with User Search Log Data》。 其应用背景是&#xff0c;现在越来越多的用户开始习惯于使用手机、PAD等移动端进行网购行为&#xff0c;而这些移…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤&#xff1a; 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求&#xff0c;可以使用 GET 或 POST 方法&#xff0c;请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

中英文在线语音转文字的方法

今天小编就来给大家分享一个中英文在线翻译的方法&#xff0c;小编这个来给大家分享一个这样很好用的方法&#xff01; 操作方法&#xff1a; 使用工具&#xff1a;录音转文字助手 第一步&#xff1a;如果将手机录音转成文字的话需要使用一个工具&#xff1a;录音转文字助手&a…

实现语音转文字功能

解决方案 最近要实现语音转文字接口&#xff0c;具体需求是录制语音后再聊天室实时显示文字&#xff1a; 目前腾讯有三种解决方案&#xff1a; 实时语音识别使用场景是一边录语音&#xff0c;一遍转文字&#xff0c;实时性较高&#xff1b;一句话识别是对60s内的语音文…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

基于Matlab求解高铁运营公司列车开行优化问题

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

问题 A: 火车站(stack)

问题 A: 火车站(stack) 时间限制: 1 Sec 内存限制: 128 MB 提交: 251 解决: 137 [提交][状态][讨论版] 题目描述 火车站只有一条铁路&#xff0c;所有的火车都停在那里。所以所有的火车都是从一边进站&#xff0c;从另一边出站。如果A列先进入铁路&#xff0c;然后B列在A列离开…

PTA L2-014列车调度

PTAL2-014列车调度&#xff08;二分法/Set集合&#xff09; 两种方法解决该问题 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列…

UVA514 铁轨问题

问题描述 &#xff1a; PopPush城市有一座著名的火车站。这个国家到处都是丘陵。而这个火车站是建于上一个世纪。不幸的是&#xff0c;那时的资金有限。所以只能建立起一条路面铁轨。而且&#xff0c;这导致这个火车站在同一个时刻只能一个轨道投入使用&#xff0c;因为它缺少…