IMX6ULL-QT项目之mplayer音乐播放器-交叉编译mplayer
在linux环境下安装mplayer后,打开ubuntu里的QT,QT安装的版本5.12.9,QT界面的图标基本都是正点原子收集的图片,实现方式参考B站里的教学
简单介绍mplayer命令:
按键操作:
音量减小:/、9
音量增大:*、0
上、下键: 前进、后退1分钟,
左键、右键:前进、后退10秒
mplayer Music/*
这个就是播放Music目录下的所有音乐,是按顺序播放的命令:
-shuffle
随机播放
-playlist list.txt
列表顺序播放
-slave
开启从模式后台播放
-loop N
重复播放N次,N=0则永远重复播放
-quiet
指定mplayer不向屏幕上,打印乱码信息
-slave
可以敲入指定命令后回车控制
-idle
播放文件至文件末尾后mplayer不退出
-softvol
不加这个参数可能无法设置静音
mplayer * < /dev/null &
后台播放,可以加参数
mplayer * < /dev/null > /dev/null 2>1&
后台播放,不可以加参数,把 mplayer *产生的所有的标准输出/输入都丢掉,
包括标准错误输出(2>1&),这样即使出错也不会跳出任何提示,完全安静的后台运行-input命令行模式下的://注意很重要,发送的指令结尾一定要\n结尾,不然无效
loadfile string //播放string指定的歌曲,string为歌曲路径+文件名(例:“loadfile ../easylove.mp3”)。
volume x 1 //设置音量,x为音量的大小。1-100
mute 1/0 //静音开关。1:静音;0:取消静音。
pause //暂停/取消暂停。
seek value //快进或快至参数value指定的秒数
当value为正时,快进;当value为负时,快退。
get_percent_pos //获得文件的播放进度(百分比:0--100)。
get_time_pos //获得文件的当前位置,以秒为单位,精确到小数位1位。
get_file_name //获得文件的文件名。
get_time_length //获得文件的长度,以秒为单位。
get_meta_album //获得文件的 '专辑' 的元数据。
get_meta_artist //获得文件的 '艺术家' 的元数据。
get_meta_comment //获得文件的 '评论' 的元数据。
get_meta_genre //获得文件的 '流派' 的元数据。
get_meta_title //获得文件的 '标题' 的元数据。
get_meta_year //获得文件的 '年份' 的元数据。get_percent_pos ----->回应格式:ANS_PERCENT_POSITION=52
get_time_pos---->回应格式:ANS_TIME_POSITION=124.2
get_file_name --->回应格式:ANS_FILENAME='da.mp3'
get_time_length ---->回应格式:ANS_LENGTH=221.00
get_meta_album--->回应格式:ANS_META_ALBUM=''
get_meta_artist--->回应格式:ANS_META_ARTIST=''
get_meta_comment--->回应格式:ANS_META_COMMENT=''
get_meta_genre--->回应格式:ANS_META_GENRE=''
get_meta_title--->回应格式:ANS_META_TITLE=''
get_meta_year--->回应格式:ANS_META_YEAR=''
上节已经交叉编译mplayer过了并且已经拷贝至开发板了,这里略过
QT代码:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QPalette>
#include <QSlider>
#include <QTime>
#include <QTimer>
#include <QListWidget>
#include <QProcess>
#include <QFileDialog>
#include <QDebug>
#include <QLabel>
#include <QTextCodec>
#include <QString>
#include <ctime>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void parts_init();
void QSlider_init();
void QListWidget_init();
void scanSong();
private slots:
void pause_clicked();
//void exit_clicked();
void prev_clicked();
void next_clicked();
void favorite_clicked();
void listcircle_clicked();
void menu_clicked();
void back_message_slot();
void getPosTime_timeout();
void musicSlide_slot(int value);
void volumeSlide_slot(int value);
void volume_clicked();
void volume_timeout();
void addfile_clicked();
void cd_timeout();
void songList_itemClicked();
private:
Ui::MainWindow *ui;
QProcess *process;
QPalette Pic;
QFileInfoList songFilelist;
QTimer *timer_cd;
QTimer *timer_getPosTime;
QTimer *timer_vol;
int cur_time,length_time,value;
QSlider *music_Slider,*volume_Slider;//进度条
QPushButton *prev_button, *pause_button, *next_button, *exit_button, *volume_button, *addfile_button,
*favorite_button, *listcircle_button, *menu_button;
QListWidget *songList;//播放列表
QLabel *label_cd;
QLabel *lable_SongTitle; //歌曲名称
QLabel *lable_Songcurrent_time;//显示 当前时间
QLabel *lable_SongTotal_time;//显示 总时间
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
int play_flag = false;
int favorite_flag = false;
int menu_flag = false;
int circle_play = true;//false=随机播放,true=循环列表
static int i =1;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("音乐播放器");
this->setFixedSize(800,500);
//Pic.setBrush(QPalette::Background,QBrush(QPixmap(":/pic/musicback0.jpeg").scaled(this->size())));
//this->setPalette(Pic);
process = new QProcess;
timer_cd = new QTimer;
connect(timer_cd,&QTimer::timeout,this,&MainWindow::cd_timeout);
timer_getPosTime = new QTimer;
connect(timer_getPosTime,&QTimer::timeout,this,&MainWindow::getPosTime_timeout);
timer_getPosTime->start(900);
parts_init();
QSlider_init();
QListWidget_init();
connect(pause_button,&QPushButton::clicked,this,&MainWindow::pause_clicked);
connect(prev_button,&QPushButton::clicked,this,&MainWindow::prev_clicked);
connect(next_button,&QPushButton::clicked,this,&MainWindow::next_clicked);
//connect(exit_button,&QPushButton::clicked,this,&MainWindow::exit_clicked);
connect(favorite_button,&QPushButton::clicked,this,&MainWindow::favorite_clicked);
connect(listcircle_button,&QPushButton::clicked,this,&MainWindow::listcircle_clicked);
connect(menu_button,&QPushButton::clicked,this,&MainWindow::menu_clicked);
connect(songList,&QListWidget::doubleClicked,this,&MainWindow::songList_itemClicked);
connect(process,&QProcess::readyReadStandardOutput,this,&MainWindow::back_message_slot);
//connect(music_Slider,&QSlider::sliderMoved,this,&MainWindow::musicSlide_slot);
connect(volume_Slider,&QSlider::valueChanged,this,&MainWindow::volumeSlide_slot);
connect(volume_button,&QPushButton::clicked,this,&MainWindow::volume_clicked);
connect(timer_vol,&QTimer::timeout,this,&MainWindow::volume_timeout);
connect(addfile_button,&QPushButton::clicked,this,&MainWindow::addfile_clicked);
}
MainWindow::~MainWindow()
{
delete process;
delete ui;
}
void MainWindow::parts_init()
{
QFont font;
label_cd = new QLabel(this);
label_cd->setGeometry(390,30,300,300);
label_cd->setStyleSheet("border-image: url(:/images/cd.png);");
lable_SongTitle = new QLabel(this);
lable_SongTitle->setGeometry(310,360,350,25);
font.setPointSize(12);
lable_SongTitle->setFont(font);
lable_SongTitle->setStyleSheet("QLabel{color:white;}QLabel{background:transparent}");
lable_SongTitle->setText("音乐PLAY");
lable_SongTitle->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
lable_Songcurrent_time = new QLabel(this);;
lable_Songcurrent_time->setGeometry(650,365,60,20);
font.setPointSize(10);
lable_Songcurrent_time->setFont(font);
lable_Songcurrent_time->setStyleSheet("QLabel{color:white;}QLabel{background:transparent}");
lable_Songcurrent_time->setText("00:00 / ");
lable_Songcurrent_time->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
lable_SongTotal_time = new QLabel(this);
lable_SongTotal_time->setGeometry(700,365,60,20);
font.setPointSize(10);
lable_SongTotal_time->setFont(font);
lable_SongTotal_time->setStyleSheet("QLabel{color:white;}QLabel{background:transparent}");
lable_SongTotal_time->setText("00:00");
lable_SongTotal_time->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
prev_button = new QPushButton;
prev_button->setFixedSize(75,75);//防止它变大或者变小
prev_button->setStyleSheet("border-image: url(:/images/btn_previous.png);");
prev_button->setIconSize(QSize(75,75));//设置图标大小
prev_button->setFlat(true);
prev_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
prev_button->setParent(this);//按钮一定要设置父窗口,不然显示不出
prev_button->move(20,400);
pause_button = new QPushButton;
pause_button->setFixedSize(75,75);//防止它变大或者变小
//pause_button->setIcon(QIcon(":/images/btn_play.png"));//这种点击效果不好看
pause_button->setStyleSheet("border-image: url(:/images/btn_play.png);");
pause_button->setIconSize(QSize(75,75));//设置图标大小
pause_button->setFlat(true);
pause_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
pause_button->setParent(this);
pause_button->move(100,400);
next_button = new QPushButton;
next_button->setFixedSize(75,75);//防止它变大或者变小
next_button->setStyleSheet("border-image: url(:/images/btn_next.png);");
next_button->setIconSize(QSize(75,75));//设置图标大小
next_button->setFlat(true);
next_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
next_button->setParent(this);
next_button->move(180,400);
/*
exit_button = new QPushButton;
exit_button->setFixedSize(75,75);//防止它变大或者变小
exit_button->setIcon(QIcon(":/images/btn_exit.png"));
exit_button->setIconSize(QSize(75,75));//设置图标大小
exit_button->setFlat(true);
exit_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
exit_button->setParent(this);
exit_button->move(760,450);
*/
addfile_button = new QPushButton;
addfile_button->setFixedSize(43,43);//防止它变大或者变小
addfile_button->setStyleSheet("border-image: url(:/images/openfile.png);");
addfile_button->setIconSize(QSize(43,43));//设置图标大小
addfile_button->setFlat(true);
addfile_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
addfile_button->setParent(this);
addfile_button->move(200,0);
addfile_button->setVisible(false);
favorite_button = new QPushButton;
favorite_button->setFixedSize(25,25);//防止它变大或者变小
favorite_button->setIcon(QIcon(":/images/btn_favorite_no.png"));
favorite_button->setIconSize(QSize(25,25));//设置图标大小
favorite_button->setFlat(true);
favorite_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
favorite_button->setParent(this);
favorite_button->move(310,430);
listcircle_button = new QPushButton;
listcircle_button->setFixedSize(25,25);//防止它变大或者变小
listcircle_button->setIcon(QIcon(":/images/btn_listcircle.png"));
listcircle_button->setIconSize(QSize(25,25));//设置图标大小
listcircle_button->setFlat(true);
listcircle_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
listcircle_button->setParent(this);
listcircle_button->move(388,430);
menu_button = new QPushButton;
menu_button->setFixedSize(25,25);//防止它变大或者变小
menu_button->setIcon(QIcon(":/images/btn_menu1.png"));
menu_button->setIconSize(QSize(25,25));//设置图标大小
menu_button->setFlat(true);
menu_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
menu_button->setParent(this);
menu_button->move(466,430);
timer_vol = new QTimer(this);//音量显示定时器
volume_button = new QPushButton;
volume_button->setFixedSize(25,25);//防止它变大或者变小
volume_button->setIcon(QIcon(":/images/btn_volume.png"));
volume_button->setIconSize(QSize(25,25));//设置图标大小
volume_button->setFlat(true);
volume_button->setFocusPolicy(Qt::NoFocus);//去除虚线边框
volume_button->setParent(this);
volume_button->move(544,430);
songList = new QListWidget(this);
songList->clear(); //清空列表
songList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //关闭水平滚动条
songList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //关闭垂直滚动条
songList->setFrameShape(QFrame::NoFrame); //去除边框
songList->setGeometry(0,35,230,370);//设置歌曲列表位置与大小
songList->setVisible(false);
}
void MainWindow::QSlider_init()
{
//播放进度滑块
music_Slider = new QSlider(Qt::Horizontal, this); //设置为水平滑动条
music_Slider->setGeometry(310,385,450,40); //设置位置和大小
music_Slider->setRange(0,100);
music_Slider->setValue(0);
music_Slider->setTracking(false); 禁用追踪
music_Slider->setStyleSheet( //设置滑块样式,如果写到qss样式文件里是不可以注释的
//滑条
"QSlider::groove:horizontal{"
" border: 1px solid #999999;"
" height: 5px; "
"position: absolute;"
"border-radius :3px;"
" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);"
" margin: 1px 0;"
" left: 3px; right: 3px;"
"}"
//小滑块
"QSlider::handle:horizontal {"
" background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);"
"border: 1px solid #5c5c5c;"
"width: 12px;"
" height: 12px; "
"margin: -2px -1; "
" border-radius: 4px;"
"}"
//滑块滑过改变样式
" QSlider::add-page:horizontal {"
"border-radius :2px;"
" margin: 1px 1;"
"background: white;"
"}"
"QSlider::sub-page:horizontal {"
"border-radius :2px;"
" margin: 1px 1;"
" background-color:#86dfc6;"
"}"
);
connect(music_Slider,&QSlider::sliderMoved,[=](int value){
//pause_button->setIcon(QIcon(":/images/btn_pause.png"));//不知道为啥,这里如果设置的话界面会卡住,暂且先留不设置
QString msg = "seek "+QString::number(value)+" 1\n";
QByteArray ba = msg.toLatin1();
process->write(ba.data());
});
//音量滑块设置
volume_Slider = new QSlider(Qt::Horizontal, this); //设置为水平滑动条
volume_Slider->setGeometry(575,433,180,20); //设置位置和大小
volume_Slider->setRange(0,100);
volume_Slider->setValue(70);//没找到可以返回实时音量的指令,默认先设置为70
volume_Slider->setTracking(true);
volume_Slider->setVisible(false);//禁用追踪
}
void MainWindow::back_message_slot()
{
while (process->canReadLine()) {
QString message(process->readLine());//也可以用readAll()函数,有点区别,但在这里没区别
//qDebug()<<message;
QStringList message_list = message.split("=");
//QString remessage_cmd = message_list[0];//这样定义下面程序会出错,留下证据,一开始不知道
//QString remessage_value = message_list[1];
if(message_list[0] == "ANS_TIME_POSITION"){
music_Slider->setValue(100*cur_time/length_time);
cur_time = message_list[1].toDouble();
QString textl = QString("%1%2:%3%4 /")
.arg(cur_time/60/10).arg(cur_time/60%10)
.arg(cur_time%60/10).arg(cur_time%60%10);
lable_Songcurrent_time->setText(textl);
QString textr = QString("%1%2:%3%4")
.arg(length_time/60/10).arg(length_time/60%10)
.arg(length_time%60/10).arg(length_time%60%10);
lable_SongTotal_time->setText(textr);
}
else if (message_list[0] == "ANS_LENGTH") {
length_time = message_list[1].toDouble();//返回的是秒为单位
}
else if (message_list[0] == "ANS_PERCENT_POSITION") { //返回当前歌曲的播放进度,单位是百分比 0-100
value = message_list[1].toInt();
//qDebug()<<value;
music_Slider->setValue(value);
if(value == 99){ //调试出有些歌不会到100,那就设置为99
pause_button->setIcon(QIcon(":/pic/pause.png")); //播放完毕,设置为暂停图标
next_clicked();
}
}
}
}
void MainWindow::getPosTime_timeout()
{
if(play_flag == true){
process->write("get_time_length\n");
process->write("get_time_pos\n");
process->write("get_percent_pos\n");
}
}
void MainWindow::pause_clicked()
{
process->write("pause\n");
if(play_flag == true){
timer_cd->stop();
pause_button->setIcon(QIcon(":/images/btn_play.png"));
play_flag = false;
}
else if(play_flag == false){
timer_cd->start();
pause_button->setIcon(QIcon(":/images/btn_pause.png"));
play_flag = true;
}
}
void MainWindow::prev_clicked()
{
/*timer_getPosTime->stop();
timer_getPosTime->start(900);
music_Slider->setValue(0);*/
int n;
play_flag = true;
pause_button->setIcon(QIcon(":/images/btn_pause.png"));
if(circle_play == false){
qsrand(time(NULL));
n = qrand() % songList->count();
}
process->close();
int curRow = 0;
curRow = songList->currentRow();
if(curRow-1 >= 0 ){
songList->setCurrentRow(curRow-1);
}else {
songList->setCurrentRow(songList->count()-1);
}
curRow = songList->currentRow();
if(circle_play == false){
curRow = n;
//qDebug()<<curRow;
}
//qDebug()<<songFilelist[curRow].filePath();
QString cmd = QString("mplayer -quiet -slave %1").arg(songFilelist[curRow].filePath());
songList->setCurrentRow(curRow);
QString tmpname = songFilelist[curRow].fileName();
QStringList list = tmpname.split(".");
QString soundname = list[0];
lable_SongTitle->setText(soundname);
process->start(cmd);
}
void MainWindow::next_clicked()
{
/*timer_getPosTime->stop();
timer_getPosTime->start(900);
music_Slider->setValue(0);*/
int n;
play_flag = true;
pause_button->setIcon(QIcon(":/images/btn_pause.png"));
if(circle_play == false){
qsrand(time(NULL));
n = qrand() % songList->count();
}
process->close();
int curRow = 0;
curRow = songList->currentRow();
if(curRow+1 < songList->count()){
songList->setCurrentRow(curRow+1);
}else {
songList->setCurrentRow(0);
}
curRow = songList->currentRow();
if(circle_play == false){
curRow = n;
//qDebug()<<curRow;
}
//qDebug()<<song_info_list[curRow].filePath();
QString cmd = QString("mplayer -quiet -slave %1").arg(songFilelist[curRow].filePath());
songList->setCurrentRow(curRow);
QString tmpname = songFilelist[curRow].fileName();
QStringList list = tmpname.split(".");
QString soundname = list[0];
lable_SongTitle->setText(soundname);
process->start(cmd);
}
/*
void MainWindow::exit_clicked()
{
process->close();
exit(0);
}
*/
void MainWindow::musicSlide_slot(int value)
{
QString msg = "seek "+QString::number(value)+" 1\n";
QByteArray ba = msg.toLatin1();
process->write(ba.data());
}
void MainWindow::volumeSlide_slot(int value)
{
timer_vol->stop();
QString msg = QString("volume %1 1\n").arg(value);
QByteArray ba = msg.toLatin1();
process->write(ba.data());
timer_vol->start(5000);
}
void MainWindow::volume_clicked()
{
volume_Slider->setVisible(true);
timer_vol->start(5000);//停留5秒
}
void MainWindow::volume_timeout()
{
timer_vol->stop();
volume_Slider->setVisible(false);
}
void MainWindow::QListWidget_init()
{
scanSong();
QListWidgetItem *item ;
for (int i = 0; i < songFilelist.size(); ++i) {
//songList->addItem(QFileInfo(List[i]).fileName());//将(歌曲)List用addItem函数加入到songList里
songList->addItem(songFilelist[i].fileName());
item = songList->item(i);
item->setSizeHint(QSize(40,40));
item->setForeground(Qt::white);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
}
}
void MainWindow::songList_itemClicked()
{
play_flag = true;
if(play_flag == true){
pause_button->setIcon(QIcon(":/images/btn_pause.png"));
timer_cd->start(1000);
}
process->close();
int clickline = 0;
clickline = songList->currentRow();
//qDebug() <<clickline;
QString tmpname = songFilelist[clickline].fileName();
QStringList list = tmpname.split(".");
QString soundname = list[0];
lable_SongTitle->setText(soundname);
QString path = songFilelist[clickline].filePath(); //绝对路径
//qDebug() <<path;
QString cmd = QString("mplayer -quiet -slave %1").arg(path);
process->start(cmd);
}
void MainWindow::scanSong()
{
QDir dir("/home/jdr/mp3");//指定需要扫描歌曲目录的路径
if (dir.exists()) {
QStringList filter;
filter << "*.mp3"
<< "*.wav"; // 包含所有.mp3 .wav后缀的文件
songFilelist = dir.entryInfoList(filter, QDir::Files); // 获得目录下的所有.mp3 .wav后缀的文件
}
}
void MainWindow::addfile_clicked()
{
//getOpenFileNames括号里的参数分别是:指定父类、标题、默认打开后显示的目录、文件过滤器
QStringList newFileList = QFileDialog::getOpenFileNames(
this,
"Select files to add",
"/home/jdr/mp3",
"Images (*.mp3 *.wav)");
//将选中的文件追加
for (int i=0;i<newFileList.size();++i){
if(!songFilelist.contains(newFileList[i])){ //防止重复添加
songFilelist.append(newFileList[i]);
songList->addItem(QFileInfo(newFileList[i]).fileName());
}
}
}
void MainWindow::favorite_clicked()
{
if(favorite_flag == false){
favorite_button->setIcon(QIcon(":/images/btn_favorite_yes.png"));
favorite_flag = true;
}else {
favorite_button->setIcon(QIcon(":/images/btn_favorite_no.png"));
favorite_flag = false;
}
}
void MainWindow::listcircle_clicked()
{
if(circle_play == true){
listcircle_button->setIcon(QIcon(":/images/random.png"));
circle_play = false;
}else {
listcircle_button->setIcon(QIcon(":/images/btn_listcircle.png"));
circle_play = true;
}
}
void MainWindow::menu_clicked()
{
if(menu_flag == false){
songList->setVisible(true);
addfile_button->setVisible(true);
menu_flag = true;
}else {
songList->setVisible(false);
addfile_button->setVisible(false);
menu_flag = false;
}
}
void MainWindow::cd_timeout()
{
i++;
if(i == 9) i=1;
QString cd = QString("border-image: url(:/images/cd%1.png);").arg(i);
label_cd->setStyleSheet(cd);
/*
* 原本想下面这方式旋转,画面会出问题,后面来研究
if(i > 360){
i=0;
}
i +=10;
QMatrix matrix;
matrix.rotate(i);
label_cd->setPixmap(QPixmap(":/images/cd.png").transformed(matrix, Qt::SmoothTransformation));
*/
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file(":/style.qss");
if (file.exists() ) {
/* 以只读的方式打开 */
file.open(QFile::ReadOnly);
/* 以字符串的方式保存读出的结果 */
QString styleSheet = QLatin1String(file.readAll());
/* 设置全局样式 */
qApp->setStyleSheet(styleSheet);
/* 关闭文件 */
file.close();
}
MainWindow w;
w.show();
return a.exec();
}
style.qss
QWidget {
background: "#25242a"
}
QListWidget{
background-color: rgba(255, 255, 255, 10%);
outline:none;border-image:transparent
}
QListWidget::item:selected:active{
background: rgb(0, 106, 181);
}
QListWidget::item:hover:active{
background: qlineargradient(spread:repeat, x2:0, y2:1, x2:1, y2:0, stop:0 #a1a112, stop:0.25 #a1a112, stop:0.5 #ba89dc, stop:1 #ba89dc);
}
运行: