内容
树莓派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-1
lastrow=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