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

内容

树莓派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

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
MPlayer是一个流行的音频和视频播放器,而Qt是一种跨平台的应用程序框架。结合使用MPlayerQt,可以制作一个功能丰富的音乐播放器。首先,你需要安装QtMPlayer。 关于Qt的安装,你可以参考这个链接:。它提供了Qt的安装教程,你可以按照其中的步骤进行安装。 而对于MPlayer的安装,你可以在终端中使用以下命令进行安装:sudo apt-get install mplayer。这个命令会从软件仓库中下载并安装MPlayer。 一旦你完成了QtMPlayer的安装,你可以开始制作音乐播放器了。你可以参考这个链接:。它提供了使用树莓派3BQtMPlayer制作音乐播放器的详细步骤。在这个链接中,你将找到关于播放、暂停、上一曲、下一曲和音量调节等功能的实现方法。 如果你需要下载MPlayer的最新源码,你可以访问这个链接:。在这个链接中,你将找到MPlayer的最新版本,并且提供了下载和编译的详细步骤。 总结起来,要制作一个mplayer qt音乐播放器,你需要先安装QtMPlayer,然后按照指引进行配置和开发。希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [树莓派3B qt+mplayer制作音乐播放器(10)](https://blog.csdn.net/qq_41102371/article/details/106305346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示](https://blog.csdn.net/qq21497936/article/details/119991329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

诺有缸的高飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值