1、madplay
madplay是一个开源的音乐播放器,可以播放各种格式的音频文件
Ubuntu中madplay的安装命令: sudo apt-get update sudo apt-get install madplay
madplay 音频文件路径
设置音量:-a -175 ~ +18(播放是按+/-调节)
显示播放的事件:-v
循环播放:-r
传入多个音频文件:
随机播放:-z
上一首/下一首:b/f
控制madplay播放的命令:
开始:
madplay 音频文件路径 &
停止:
killall -KILL madplay &
暂停:
killall -STOP madplay &
继续:
killall -CONT madplay &
测试代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { //1.播放 system("madplay 1one.mp3 &"); printf("\n开始播放\n"); sleep(5); //2.暂停播放 system("killall -STOP madplay &"); printf("\n暂停播放\n"); sleep(3); //3.继续播放 system("killall -CONT madplay &"); printf("\n继续播放\n"); sleep(10); //4.停止播放 system("killall -KILL madplay &"); printf("\n停止播放\n"); return 0; }
效果:
2.Qt中如何控制音频播放
(1)在Qt程序中启动进程(QProcess)播放madplay
QProcess的成员函数:
start ------ 启动
kill ------- 停止
waitForFinished ------ 等待结束
state ------ 进程状态
excute(命令,参数) ------- 停止进程执行的内容等待执行完指定的现有程序后继续执行原内容
(2)将madplay播放程序移植到开发板
使用tftp传输文件到开发板:
1)保证开发板电脑网络畅通
2)在电脑启动tftp服务器,设置好下载目录
(3)在开发板命令行执行下载命令
tftp -g -r 下载文件名 电脑ip
注:不同开发板操作不一样,可以查你们手中开发板的芯片资料进行操作,我使用的开发板是GEC6818开发板
(3)测试代码:实现播放、停止、暂停继续、添加音乐、删除选中音乐、上一首、下一首、双击播放音乐的操作。
#include "mymadplay.h" #include "ui_mymadplay.h" #include <unistd.h> #include <QDebug> #include <QFileDialog> MyMadplay::MyMadplay(QWidget *parent) : QWidget(parent) , ui(new Ui::MyMadplay) { ui->setupUi(this); p = new QProcess(this); ui->pushButton_stopcont->setEnabled(false); } MyMadplay::~MyMadplay() { on_pushButton_kill_clicked(); delete ui; } //播放 void MyMadplay::on_pushButton_start_clicked() { //播放 if(p->state()==QProcess::Running){ p->kill(); p->waitForFinished(); } QString cmd = "madplay"; QStringList args; //记录当前正在播放的歌曲 current_music = ui->listWidget->currentItem()->text(); args<<current_music<<"&"; p->start(cmd,args); ui->pushButton_stopcont->setText("暂停"); ui->pushButton_stopcont->setEnabled(true); } //停止 void MyMadplay::on_pushButton_kill_clicked() { if(p->state()==QProcess::Running){ p->kill(); p->waitForFinished(); } ui->pushButton_stopcont->setText("暂停"); ui->pushButton_stopcont->setEnabled(false); } //暂停/继续 void MyMadplay::on_pushButton_stopcont_clicked() { QString cmd = "killall"; QStringList args; //暂停 if(ui->pushButton_stopcont->text()=="暂停"){ args<<"-STOP"<<"madplay"; ui->pushButton_stopcont->setText("继续"); } else{//继续 args<<"-CONT"<<"madplay"; ui->pushButton_stopcont->setText("暂停"); } p->execute(cmd,args);//临时执行 } //添加音乐 void MyMadplay::on_pushButton_addmusic_clicked() { QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","/Even/music","*.mp3 *.WAV"); //去重 for(int i=0;i<ui->listWidget->count();i++){ for(int j=0;j<music_files.count();j++){ if(ui->listWidget->item(i)->text()==music_files.at(j)){ music_files.removeAt(j); break; } } } //添加到ListWid ui->listWidget->addItems(music_files); //定位 ui->listWidget->setCurrentRow(0); } //删除选中音乐 void MyMadplay::on_pushButton_delmusic_clicked() { int delrow = ui->listWidget->currentRow(); //取出一项 QListWidgetItem *item = ui->listWidget->takeItem(delrow); //如果取出的项正在播放,停止播放 if(item->text()==current_music) on_pushButton_kill_clicked(); if(item) delete item; } void MyMadplay::on_pushButton_clearmusic_clicked() { ui->listWidget->clear(); //停止播放 on_pushButton_kill_clicked(); } //上一首 void MyMadplay::on_pushButton_prev_clicked() { int row = ui->listWidget->currentRow(); if(row==0) row = ui->listWidget->count()-1; else row--; ui->listWidget->setCurrentRow(row); //关闭当前播放,播放下一首 on_pushButton_start_clicked(); } //下一首 void MyMadplay::on_pushButton_next_clicked() { int row = ui->listWidget->currentRow(); if(row==ui->listWidget->count()-1) row = 0; else row++; ui->listWidget->setCurrentRow(row); //关闭当前播放,播放下一首 on_pushButton_start_clicked(); } //双击播放 void MyMadplay::on_listWidget_itemDoubleClicked(QListWidgetItem *item) { if(p->state()==QProcess::Running){ p->kill(); p->waitForFinished(); } QString cmd = "madplay"; QStringList args; //记录当前正在播放的歌曲 current_music = item->text(); args<<current_music<<"&"; p->start(cmd,args); ui->pushButton_stopcont->setText("暂停"); ui->pushButton_stopcont->setEnabled(true); }
3.Qt中的多媒体模块
(1)简介
QMediaPlayer是Qt预定义的播放多媒体文件的类,可以播放各类音视频文件,比如mp3,mp4,WAV,avi…,既可以播放单个文件,也可以和QMediaPlaylist(播放列表)相结合,对一个播放列表进行播放。
多媒体相关的类在Qt中属于多媒体模块,使用时需要在工程文件中手动添加,开发板的Qt没有该模块。
QT += multimedia
(2)QMediaPlayer类的介绍
1)设置播放的媒体/播放列表
//设置播放的媒体 [slot] void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream = nullptr); //设置播放列表 void setPlaylist(QMediaPlaylist *playlist); //播放列表需要设置播放模式,使用其成员函数设定 void setPlaybackMode(QMediaPlaylist::PlaybackMode mode);
2)播放、停止、暂停
play() ----- 播放
stop() ----- 停止
pause() ---- 暂停
3)获取当前播放媒体,设置音量,设置进度
//当前播放媒体 QMediaContent QMediaPlayer::currentMedia() const; //设置音量 void setVolume(int volume); //设置进度 void setPosition(qint64 position);
(3)信号
1)状态改变
[signal] void QMediaPlayer::stateChanged(QMediaPlayer::State state);
2)播放媒体改变
[signal] void QMediaPlayer::currentMediaChanged(const QMediaContent &media);
3)播放总长度(周期)改变
[signal] void QMediaPlayer::durationChanged(qint64 duration);//ms单位
4)播放进度改变
[signal] void QMediaPlayer::positionChanged(qint64 position);//ms单位
(3)QMediaPlaylist介绍
成员函数:
1.添加媒体 bool QMediaPlaylist::addMedia(const QMediaContent &content); 2.删除媒体 bool QMediaPlaylist::removeMedia(int pos); 3.清空媒体 bool QMediaPlaylist::clear(); 4.设置当前媒体 [slot] void QMediaPlaylist::setCurrentIndex(int playlistPosition);
测试代码:
#include "mymediaplayer.h" #include "ui_mymediaplayer.h" #include <QUrl> #include <QFileDialog> MyMediaPlayer::MyMediaPlayer(QWidget *parent) : QWidget(parent) , ui(new Ui::MyMediaPlayer) { ui->setupUi(this); player = new QMediaPlayer(this); playlist = new QMediaPlaylist(this); //设置媒体 //player->setMedia(QUrl::fromLocalFile("E:/GZ2142/11-Qt/Qt高级资料/music/1one.mp3")); //设置播放模式 playlist->setPlaybackMode(QMediaPlaylist::Loop);//循环播放 //设置播放器的播放列表 player->setPlaylist(playlist); //连接周期改变和进度改变的信号 QObject::connect(player,&QMediaPlayer::durationChanged,this,[&](qint64 duration){ //设置进度条的最大值 ui->horizontalSlider->setRange(0,duration); //显示周期 music_duration = QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')) .arg(duration/1000%60,2,10,QChar('0')); ui->label_pos->setText(QString("00:00/%1").arg(music_duration)); //显示歌曲切换 ui->listWidget->setCurrentRow(playlist->currentIndex()); }); QObject::connect(player,&QMediaPlayer::positionChanged,this,[&](qint64 position){ //更新进度条的值 ui->horizontalSlider->setValue(position); //显示进度 ui->label_pos->setText(QString("%1:%2/%3").arg(position/1000/60,2,10,QChar('0')) .arg(position/1000%60,2,10,QChar('0')) .arg(music_duration)); }); //禁止暂停按钮 ui->pushButton_stopcont->setEnabled(false); } MyMediaPlayer::~MyMediaPlayer() { delete ui; } //播放 void MyMediaPlayer::on_pushButton_start_clicked() { //指定当前播放的文件 int row = ui->listWidget->currentRow(); playlist->setCurrentIndex(row); player->play(); //音量设置 player->setVolume(ui->verticalSlider->value()); ui->pushButton_stopcont->setEnabled(true); } void MyMediaPlayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item) { //指定当前播放的文件 int row = ui->listWidget->currentRow(); playlist->setCurrentIndex(row); player->play(); //音量设置 player->setVolume(ui->verticalSlider->value()); ui->pushButton_stopcont->setEnabled(true); } void MyMediaPlayer::on_pushButton_kill_clicked() { //禁止暂停按钮 ui->pushButton_stopcont->setEnabled(false); player->stop(); } void MyMediaPlayer::on_pushButton_stopcont_clicked() { ui->pushButton_stopcont->setEnabled(false); player->pause(); } //上一首 void MyMediaPlayer::on_pushButton_prev_clicked() { int row = ui->listWidget->currentRow(); if(row==0) row = ui->listWidget->count()-1; else row--; ui->listWidget->setCurrentRow(row); //设置playlist playlist->setCurrentIndex(row); player->play(); //音量设置 player->setVolume(ui->verticalSlider->value()); ui->pushButton_stopcont->setEnabled(true); } //下一首 void MyMediaPlayer::on_pushButton_next_clicked() { int row = ui->listWidget->currentRow(); if(row==ui->listWidget->count()-1) row = 0; else row++; ui->listWidget->setCurrentRow(row); //设置playlist playlist->setCurrentIndex(row); player->play(); //音量设置 player->setVolume(ui->verticalSlider->value()); ui->pushButton_stopcont->setEnabled(true); } //添加音乐 void MyMediaPlayer::on_pushButton_addmusic_clicked() { QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","E:/GZ2142/11-Qt/Qt高级资料/music","*.mp3 *.WAV"); //去重 for(int i=0;i<ui->listWidget->count();i++){ for(int j=0;j<music_files.count();j++){ if(ui->listWidget->item(i)->text()==music_files.at(j)){ music_files.removeAt(j); break; } } } //如果无添加直接返回 if(music_files.isEmpty()) return; //添加到playlist for(int i=0;i<music_files.count();i++){ QString file = music_files.at(i); playlist->addMedia(QUrl(file)); } //添加到ListWid ui->listWidget->addItems(music_files); //定位 ui->listWidget->setCurrentRow(0); } //删除音乐 void MyMediaPlayer::on_pushButton_delmusic_clicked() { int delrow = ui->listWidget->currentRow(); //取出一项 QListWidgetItem *item = ui->listWidget->takeItem(delrow); if(item) delete item; //从playlist中删除 playlist->removeMedia(delrow); } //清空显示 void MyMediaPlayer::on_pushButton_clearmusic_clicked() { ui->listWidget->clear(); playlist->clear(); } //设置音量 void MyMediaPlayer::on_verticalSlider_sliderMoved(int position) { player->setVolume(position); //更新显示 ui->label_vol->setText(QString("音量:%1").arg(position)); } //调整进度 void MyMediaPlayer::on_horizontalSlider_sliderMoved(int position) { player->setPosition(position); }
效果: