内容

树莓派3B qt+mplayer制作音乐播放器:播放、暂停、上一曲、下一曲,音量调节。
平台:树莓派+qt+mplayer

1、配置

qt安装见此:
https://blog.csdn.net/qq_41102371/article/details/105854108
mplayer安装

sudo apt-get install mplayer

安装后,输入mplayer,出现mplayer的命令提示则是安装成功,linux下编程实现mplayer总结在此

2、上代码

1、说明

基于此文的源码:QT+树莓派实现一个简单的播放器(感谢该作者)
以下内容对上述代码有所删减、改动,新增部分:暂停、上下一曲,音量调节去bug、点击高亮等。
项目全部代码在此(我的音乐文件有点大,考虑到有需要的朋友下载方便,里面就没有音乐文件,只有代码和list,list自己改下):
https://blog.csdn.net/qq_41102371/article/details/125646840
或者愿意用c币支持的朋友在这里:Player_noel.zip
下载后打开qt—>打开工程或项目—>选择player.pro—>直接编译运行:

2、源码

下面给出主要代码mainwindow.cpp
方便大家理解,就直接在代码中边看代码边用注释解释

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QMessageBox>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QProcess>
#include <QStringList>
#include <QMouseEvent>
#include <QMovie>
#include <QPoint>
#include <QThread>
#include <QPixmap>
#include <QPainter>
#include <QTableWidgetItem>
#include <QHeaderView>
namespace MyNamespace {//music.list是在此指定目录下的一个文本,里面是同级目录下的歌曲名
QString baseListPath="/home/pi/qtproject/player/music.list";
//在此目录下找music.list中的同名歌曲
QString baseFilePath="/home/pi/qtproject/player/";
QProcess musicProcess;//用于命令行写入
}
//border-image: url(:/image/res/stars.jpg);
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);loadList();//加载歌曲列表initTableViewData();//点击事件:上一曲QObject::connect(ui->preBtn, SIGNAL(clicked()), this, SLOT(pre()));//点击事件:播放QObject::connect(ui->playBtn, SIGNAL(clicked()), this, SLOT(play()));//点击事件:下一曲QObject::connect(ui->nextBtn, SIGNAL(clicked()), this, SLOT(next()));//点击事件:停止播放QObject::connect(ui->stopBtn, SIGNAL(clicked()), this, SLOT(stop()));currentrow=0;//列表中当前选中项的行号从0----->n-1lastrow=0;//上一次的位置号play_state=0;//播放状态(1正在播放,0暂停)ui->musicListView->item(currentrow)->setSelected(true);//初始化选中第一首歌ui->musicNameLabel->setText(ui->musicListView->item(currentrow)->text().left(20));//初始化显示第一首歌的名字}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::playicon()//图标变为播放
{QSize size(50,50);ui->playBtn->setIconSize(size);ui->playBtn->setIcon(QIcon(":/image/res/pause.png"));//
}
void MainWindow::pauseicon()//图标变为暂停
{QSize size(50,50);ui->playBtn->setIconSize(size);ui->playBtn->setIcon(QIcon(":/image/res/play.png"));
}
void MainWindow::pre(){if(currentrow>=1)//1为当前选中为第二首,大于等于1则可以切换至上一首{currentrow=currentrow-1;//当前选中号减一,达到选中上一曲的目的lastrow=currentrow;//两变量进行同步ui->musicListView->item(currentrow)->setSelected(true);ui->musicNameLabel->setText(ui->musicListView->item(currentrow)->text().left(20));//先停止上一曲,如果不停止,mplayer另外的歌是没法实现的MyNamespace::musicProcess.write("stop\n");//等待进程结束,必须要MyNamespace::musicProcess.waitForFinished();//可以安心放下一曲了,此句代码相当于在命令行输入:mplayer -slave -quiet xxx.MP3进行播放//MyNamespace::baseFilePath+ui->musicListView->item(currentrow)->text()是获取列表中选中项的文件名MyNamespace::musicProcess.start("mplayer -slave -quiet "+MyNamespace::baseFilePath+ui->musicListView->item(currentrow)->text());qDebug()<<"paly now:"+ui->musicListView->item(currentrow)->text()<<endl;//提示当前的播放playicon();//切换播放图标play_state=1;//设置播放状态为正在播放}ui->musicListView->item(currentrow)->setSelected(true);
}//高亮选中的项void MainWindow::next(){//totalrow-1为当前选中为最后一首首,小于等于totalrow-2则可以切换至下一首if(currentrow<=totalrow-2){currentrow=currentrow+1;lastrow=currentrow;ui->musicListView->item(currentrow)->setSelected(true);ui->musicNameLabel->setText(ui->musicListView->item(currentrow)->text().left(20));MyNamespace::musicProcess.write("stop\n");MyNamespace::musicProcess.waitForFinished();MyNamespace::musicProcess.start("mplayer -slave -quiet "+MyNamespace::baseFilePath+ui->musicListView->item(currentrow)->text());qDebug()<<"paly now:"+ui->musicListView->item(currentrow)->text()<<endl;playicon();play_state=1;}ui->musicListView->item(currentrow)->setSelected(true);}void MainWindow::stop(){MyNamespace::musicProcess.write("stop\n");//停止播放pauseicon();//切换音乐暂停图标}void MainWindow::play(){//判断当前是否正在播放音乐,等于0则是没有if(MyNamespace::musicProcess.pid()==0){//播放MyNamespace::musicProcess.start("mplayer -slave -quiet "+MyNamespace::baseFilePath+ui->musicListView->item(currentrow)->text());qDebug()<<"paly now:"+ui->musicListView->item(currentrow)->text()<<endl;playicon();play_state=1;}else {if(lastrow==currentrow){//lastrow等于currentrow,选中的是正在播放的歌,那么执行暂停/播放(正播放时,pause命令可暂停,正暂停时,pause能恢复播放)MyNamespace::musicProcess.write("pause\n");play_state=!play_state;if(play_state==0){qDebug()<<"pause now:"+ui->musicListView->item(currentrow)->text()<<endl;pauseicon();}else {qDebug()<<"paly now:"+ui->musicListView->item(currentrow)->text()<<endl;playicon();}}//lastrow不等于currentrow,选中的不是正在播放的歌,那么执行直接播放选中的歌else {MyNamespace::musicProcess.write("stop\n");MyNamespace::musicProcess.waitForFinished();MyNamespace::musicProcess.start("mplayer -slave -quiet "+MyNamespace::baseFilePath+ui->musicListView->item(currentrow)->text());qDebug()<<"paly now:"+ui->musicListView->item(currentrow)->text()<<endl;playicon();play_state=1;}}}//用于程序一开始的初始化列表void MainWindow::loadList(){// /home/pi/qtproject/player/QFile file("/home/pi/qtproject/player/music.list");QStringList list;if ( file.open( QFile::ReadOnly) ) {while ( !file.atEnd()) {list.append(file.readLine());}ui->musicListView->addItems(list);file.close();totalrow=ui->musicListView->count();//列表内容总数计数}else{qDebug()<<"Load Error!"<<endl;}}
void MainWindow::on_musicListView_itemClicked(QListWidgetItem *item)
{//点击音乐列表里的项来触发此函数currentrow=ui->musicListView->currentRow();//得到选中的项的序号,currentrow与lastrow在此产生差异qDebug()<<MyNamespace::baseFilePath<<item->text()<<endl;ui->musicNameLabel->setText(item->text().left(20));qDebug()<<"loadfile "+item->text().toLatin1()+ "\n"<<endl;//         getTimeLength();//读取音乐的更多信息,弃用
}void MainWindow::on_actionRefresh_triggered()
{//触发刷新列表QFile file(MyNamespace::baseListPath);QStringList list;if ( file.open( QFile::ReadOnly) ) {while ( !file.atEnd()) {list.append(file.readLine());}ui->musicListView->addItems(list);file.close();}else{qDebug()<<"Load Error!"<<endl;}
}
void MainWindow::paintEvent(QPaintEvent *)
{//主背景,让信息更醒目,先不要背景
//    QPixmap pixmap = QPixmap(":/image/res/earth.jpg").scaled(this->size());
//    QPainter painter(this);
//    painter.drawPixmap(this->rect(), pixmap);
}
void MainWindow::getTimePos()  {MyNamespace::musicProcess.write("get_time_pos\n");//见mplayer的命令qDebug()<< "Time :"<< MyNamespace::musicProcess.readLine();
}
void MainWindow::getTimeLength()  {MyNamespace::musicProcess.write("get_time_length\n");//见mplayer的命令qDebug()<< "Time :"<< MyNamespace::musicProcess.readLine();ui->timeProgessLabel->setText(  MyNamespace::musicProcess.readLine());
}void MainWindow::on_volumDial_sliderMoved(int position)
{//表盘式音量增减,position是传入的当前位置(0-----100)qDebug()<<"Volum "<<QString ("volume %1 1\n").arg(position).toLatin1()<<endl;MyNamespace::musicProcess.write(QString ("volume %1 1\n").arg(position).toLatin1() );
//         qDebug()<<"Volum "<<MyNamespace::musicProcess.readLine()<<endl;
}void MainWindow::initTableViewData(){}void MainWindow::on_verticalSlider_sliderMoved(int position)
{//条状音量增减,position是传入的当前位置(0-----100)qDebug()<<"Volum "<<QString ("volume %1 1\n").arg(position).toLatin1()<<endl;MyNamespace::musicProcess.write(QString ("volume %1 1\n").arg(position).toLatin1());
}

注:歌曲名尽量短,长了没法播放。原因:不详,待解

3、运行与说明

1、背景

列表控件的背景:在mainwindow.ui里面,找到列表控件,stylesheet里面,加入:

border-image: url(:/image/res/stars.jpg);


主背景:去掉此函数的屏蔽

void MainWindow::paintEvent(QPaintEvent *)
{QPixmap pixmap = QPixmap(":/image/res/earth.jpg").scaled(this->size());QPainter painter(this);painter.drawPixmap(this->rect(), pixmap);
}

如果想换背景:文本方式打开image.qrc

按照上面的样式,添加自己的图片名字,比如earth.jpg和stars.jpg:

同时,将图片要放进res文件夹

这样就能使用这两张图片当背景了

2、运行

有背景,(好丑):

无背景:
音量:

播放:


暂停:

下一首:略
上一首:略
点击选一首播放:略

参考并感谢

linux下编程实现mplayer总结:http://blog.chinaunix.net/uid-10221131-id-339457.html
QT+树莓派实现一个简单的播放器:https://shumeipai.nxez.com/2016/05/28/qt-raspberry-pi-achieve-a-simple-player.html
获取列表控件中被选中行号:https://blog.csdn.net/naibozhuan3744/article/details/78988585
获取列表控件总行数:https://www.cnblogs.com/kennyhip/articles/11026676.html
Qlistwidget控件使用:https://www.cnblogs.com/fuqia/p/9003760.html
点击选中列表中的某一项为高亮状态:https://zhidao.baidu.com/question/2116333869495124587.html
图标:https://blog.csdn.net/liuyanfeier/article/details/52743319

课程作业,边学边用,如有错漏,敬请指正
--------------------------------------------------------------------------------------------诺有缸的高飞鸟202005

树莓派3B qt+mplayer制作音乐播放器(10)相关推荐

  1. qt phonon 制作音乐播放器学习(怎样让播放进度条和音乐播放时长同步)

    在播放媒体文件时,媒体对象MediaObject 会在指定的时间间隔发射tick(qint64  time)信号, 这个时间间隔可以使用setTickInterval()来进行设置,tick()中的t ...

  2. mplayer-php,jQuery MPlayer网站音乐播放器插件

    jQuery MPlayer网站音乐播放器插件 这是一款2017年贺新春版的红色喜庆音乐播放器代码,jQuery MPlayer网站音乐播放器插件下载. 注意:演示效果在左下角收起来了,别以为没演示! ...

  3. 基于QT的网络音乐播放器(一)

    自学Qt已经有一段时间了,但是始终感觉自己还是很弱(其实并不是感觉自己很弱,是自己本来就很弱,哈哈).自己也照着书上敲了几个例子,但觉得还是要写点东西才能真正运用起来.所以,前段时间就写了个很简单的音 ...

  4. winform制作音乐播放器

    winform制作音乐播放器 本文利用C# 调用Windows自带的Windows Media Player 打造一款属于自己的音乐播放器,以供学习分享使用,如有不足之处,还请指正. 概述 Windo ...

  5. 【基于Qt的在线音乐播放器】

    基于Qt的在线音乐播放器 项目功能: 本在线音乐播放器的功能在于创建一个音乐播放器页面,可以实现搜索功能通过HTTP协议获取网络中数据并解析出来,播放搜索到的歌曲并展示相关信息.效果如图: 相关类及功 ...

  6. 基于Arduino Uno开发板制作音乐播放器

    基于Arduino Uno开发板制作音乐播放器 本文将基于Arduino开发板实现一个音乐播放器. 利用Arduino Uno读取sd卡模块中内存卡的音乐,传输信号到扬声器进行播放. 一.项目软硬件简 ...

  7. 用Python制作音乐播放器(下,含完整源代码)

    哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 音乐播放器,大家应该不陌生吧!今天我们一起来学习如何用python制作音乐播放器.之所开头有一个"下",是因为我们以前已经 ...

  8. 用Python制作音乐播放器(上)

    用Python制作简单的音乐播放器 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 音乐播放器,大家应该不陌生吧!今天我们一起来学习如何用python制作音乐播放器.之所开头有一个" ...

  9. 基于QT开发的音乐播放器(附源码)

    基于QT开发的音乐播放器(附源码) 一.简介 1.介绍 2.功能描述 3.系统功能层次模块图 4.各模块功能描述 (1)播放界面 (2)歌词 (3)歌曲信息 (4)歌曲列表 5.文件格式 6.运行环境 ...

最新文章

  1. 中国顶级黑客45秒使用声音来破坏您的计算机
  2. spring boot整合mybatis+通用mapper+pagehelper分页插件
  3. 第三次学JAVA再学不好就吃翔(part106)--字符流
  4. 网络传播动力学_通过简单的规则传播动力
  5. Python之 if-elif-else
  6. 蚂蚁金服发布眼纹识别技术,背后的原理是怎样的?
  7. Java 日期格式工具类
  8. C语言程序的基本,C语言编程基础知识汇总学习,适合初学者!
  9. 人工智能python编程训练营_贪心科技 人工智能 Python 编程特训营 第四个主题项目代码...
  10. Luminar 4:AI 人像照片增强器
  11. Logstash系列:发送邮件告警、发送POST告警
  12. 递归专题---[2]开根号
  13. 某高校校园卡网站模拟登陆(php)
  14. 如何彻底删除ELTIMA的vspd(虚拟串口)
  15. MAC下PHP开发环境教程
  16. 中国智能控制器行业“十四五”投资规划及前景趋势报告2022~2028年
  17. 不插卡就可以实现全网通上网的设备——无线宽带
  18. 不要跟别人争对错,争了,对也变成错了。
  19. 批量导出VSD文件到JPG文件 宏
  20. 百度文库文档(文字和图片)

热门文章

  1. k8s+Jenkins+GitLab-自动化部署tomcat项目
  2. 【七天入门Go语言】 GC垃圾回收三色标记 | 第七天
  3. 物联卡流量虚吗?说虚的说明你被骗了!
  4. 小米红米全系列官方原厂预装系统
  5. 面向对象设计的3个基本特征和5个原则
  6. jquery实现新闻消息滚动
  7. 监控FTP服务状态,并自动重启servU
  8. UbuntuKylin引领我们走上开放创新之路
  9. eja智能压力变送器工作原理_HONEYWEL、 EJA 、罗斯蒙特变送器的工作原理
  10. 一套策划正确的网页配色方案