目录
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 &
在Qt程序中启动进程(QProcess)播放madplay。
QProcess相关介绍:
start :启动
kill :停止
waitForFinished :等待结束
state:状态
excute(命令,参数):停止进程执行的内容等待执行完指定程序后继续执行原内容
ui布局:

musicplayer.h文件
- #ifndef MUSICPLAYER_H
- #define MUSICPLAYER_H
-
- #include
- #include
- #include
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class MusicPlayer; }
- QT_END_NAMESPACE
-
- class MusicPlayer : public QWidget
- {
- Q_OBJECT
-
- public:
- MusicPlayer(QWidget *parent = nullptr);
- ~MusicPlayer();
-
- private slots:
- void on_pushButton_play_clicked();
-
- void on_pushButton_cancel_clicked();
-
- void on_pushButton_addmusic_clicked();
-
- void on_pushButton_deletemusic_clicked();
-
- void on_pushButton_clearmusic_clicked();
-
- void on_pushButton_stop_cont_clicked();
-
- void on_pushButton_prev_clicked();
-
- void on_pushButton_next_clicked();
-
- void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
-
- private:
- Ui::MusicPlayer *ui;
- QProcess *p;
- //记录正在播放的音乐
- QString current_music;
- };
- #endif // MUSICPLAYER_H
musicplayer.cpp文件
- #include "musicplayer.h"
- #include "ui_musicplayer.h"
- #include
-
- MusicPlayer::MusicPlayer(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::MusicPlayer)
- {
- ui->setupUi(this);
-
- p = new QProcess(this);
- }
-
- MusicPlayer::~MusicPlayer()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- delete ui;
- }
-
- //播放
- void MusicPlayer::on_pushButton_play_clicked()
- {
- //只有没有运行才开始播放
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- QString cmd = QString("madplay");
- QStringList args;//参数
-
- current_music = ui->listWidget->currentItem()->text();
- args<
"&"; -
- p->start(cmd,args);
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(true);
- }
-
- //停止
- void MusicPlayer::on_pushButton_cancel_clicked()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(false);
- }
-
- //添加音乐
- void MusicPlayer::on_pushButton_addmusic_clicked()
- {
- QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","/music","*.mp3 *.WAV");
-
- //去重
- for(int i=0;i
listWidget->count();i++){ - for(int j=0;j
count();j++){ - if(ui->listWidget->item(i)->text()==music_files.at(j)){
- music_files.removeAt(j);
- break;
- }
- }
- }
-
- //如果无添加文件,直接返回
- if(music_files.isEmpty())
- return;
-
- //添加到listWidget
- ui->listWidget->addItems(music_files);
- //定位
- ui->listWidget->setCurrentRow(0);
- }
-
- //删除音乐
- void MusicPlayer::on_pushButton_deletemusic_clicked()
- {
- int row = ui->listWidget->currentRow();
- //取出一项
- QListWidgetItem *item = ui->listWidget->takeItem(row);
- //删除的是正在播放的歌曲,停止播放
- if(item->text()==current_music){
- on_pushButton_cancel_clicked();
- }
-
- if(item){
- delete item;
- }
- }
-
- //清空
- void MusicPlayer::on_pushButton_clearmusic_clicked()
- {
- ui->listWidget->clear();
-
- on_pushButton_cancel_clicked();
- }
-
- //暂停
- void MusicPlayer::on_pushButton_stop_cont_clicked()
- {
- QString cmd = "killall";
- QStringList args;
-
- if(ui->pushButton_stop_cont->text()=="暂停"){
- args<<"-STOP"<<"madplay"<<"&";
- ui->pushButton_stop_cont->setText("继续");
- }
- else{
- args<<"-CONT"<<"madplay"<<"&";
- ui->pushButton_stop_cont->setText("暂停");
- }
-
- //阻塞执行
- p->execute(cmd,args);
- }
-
- //上一首
- void MusicPlayer::on_pushButton_prev_clicked()
- {
- int row = ui->listWidget->currentRow();
- if(row==0)
- row = ui->listWidget->count();
-
- row--;
-
- ui->listWidget->setCurrentRow(row);
-
- //播放下一首
- on_pushButton_play_clicked();
- }
-
- //下一首
- void MusicPlayer::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_play_clicked();
- }
-
- void MusicPlayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
- {
- //只有没有运行才开始播放
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- QString cmd = QString("madplay");
- QStringList args;//参数
-
- current_music = item->text();
- args<
"&"; -
- p->start(cmd,args);
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(true);
- }
mplayer是一个免费开源的视频播放器,视频播放器提供视频解码并播放的功能,支持各种常见格式的视频,用法和madplay类似。
使用指令:
mplayer 视频文件路径
参数:
-quiet : 输出变化信息
-slave :后台命令处理模式
-geometry :指定播放位置(开发板无效)
-zoom -x ** -y ## :指定播放分辨率
-af volume=xxx :设置音量(-200 ~ +60)
使用Qt界面控制mplayer,和控制madplay一样,唯一的区别是需要预留播放视频图像的区域。
ui布局

mymplayer.h
- #ifndef MYMPLAYER_H
- #define MYMPLAYER_H
-
- #include
- #include
- #include
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class MyMplayer; }
- QT_END_NAMESPACE
-
- class MyMplayer : public QWidget
- {
- Q_OBJECT
-
- public:
- MyMplayer(QWidget *parent = nullptr);
- ~MyMplayer();
-
- private slots:
- void on_pushButton_addvideo_clicked();
-
- void on_pushButton_deletevideo_clicked();
-
- void on_pushButton_clearvideo_clicked();
-
- void on_pushButton_play_clicked();
-
- void on_pushButton_cancel_clicked();
-
- void on_pushButton_stop_cont_clicked();
-
- void on_pushButton_prev_clicked();
-
- void on_pushButton_next_clicked();
-
- void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
-
- private:
- Ui::MyMplayer *ui;
- QProcess *p;
- //记录正在播放的视频
- QString current_video;
- };
- #endif // MYMPLAYER_H
mymplayer.cpp
- #include "mymplayer.h"
- #include "ui_mymplayer.h"
- #include
- #include
- #include
-
- MyMplayer::MyMplayer(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::MyMplayer)
- {
- ui->setupUi(this);
-
- p = new QProcess(this);
- }
-
- MyMplayer::~MyMplayer()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- delete ui;
- }
-
- //添加视频
- void MyMplayer::on_pushButton_addvideo_clicked()
- {
- QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","/video","*.mp4 *.avi");
-
- //去重
- for(int i=0;i
listWidget->count();i++){ - for(int j=0;j
count();j++){ - if(ui->listWidget->item(i)->text()==video_files.at(j)){
- video_files.removeAt(j);
- break;
- }
- }
- }
-
- //如果无添加文件,直接返回
- if(video_files.isEmpty())
- return;
-
- //添加到listWidget
- ui->listWidget->addItems(video_files);
- //定位
- ui->listWidget->setCurrentRow(0);
- }
-
- //删除视频
- void MyMplayer::on_pushButton_deletevideo_clicked()
- {
- int row = ui->listWidget->currentRow();
- //取出一项
- QListWidgetItem *item = ui->listWidget->takeItem(row);
- //删除的是正在播放的歌曲,停止播放
- if(item->text()==current_video){
- on_pushButton_cancel_clicked();
- }
-
- if(item){
- delete item;
- }
- }
-
- void MyMplayer::on_pushButton_clearvideo_clicked()
- {
- ui->listWidget->clear();
-
- on_pushButton_cancel_clicked();
- }
-
- //播放
- void MyMplayer::on_pushButton_play_clicked()
- {
- //只有没有运行才开始播放
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- QString cmd = QString("mplayer");
- QStringList args;//参数
-
- current_video = ui->listWidget->currentItem()->text();
- args<<"-quiet"<<"-slave"<<"-af"<<"volume=-10"<<"-zoom"
- <<"-x"<<"600"<<"-y"<<"360"<
"&"; -
- p->start(cmd,args);
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(true);
- }
-
- //停止
- void MyMplayer::on_pushButton_cancel_clicked()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(false);
-
- ui->label->clear();
- }
-
- //暂停继续
- void MyMplayer::on_pushButton_stop_cont_clicked()
- {
- QString cmd = "killall";
- QStringList args;
-
- if(ui->pushButton_stop_cont->text()=="暂停"){
- args<<"-STOP"<<"mplayer";
- ui->pushButton_stop_cont->setText("继续");
- }
- else{
- args<<"-CONT"<<"mplayer";
- ui->pushButton_stop_cont->setText("暂停");
- }
-
- //阻塞执行
- p->execute(cmd,args);
- }
-
- //上一首
- void MyMplayer::on_pushButton_prev_clicked()
- {
- int row = ui->listWidget->currentRow();
- if(row==0)
- row = ui->listWidget->count();
-
- row--;
-
- ui->listWidget->setCurrentRow(row);
-
- //播放下一首
- on_pushButton_play_clicked();
- }
-
- //下一首
- void MyMplayer::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_play_clicked();
- }
-
- //双击播放
- void MyMplayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
- {
- //只有没有运行才开始播放
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- QString cmd = QString("mplayer");
- QStringList args;//参数
-
- current_video = item->text();
- args<<"-quiet"<<"-slave"<<"-af"<<"volume=-10"<<"-zoom"
- <<"-x"<<"600"<<"-y"<<"360"<
"&"; -
- p->start(cmd,args);
-
- ui->pushButton_stop_cont->setText("暂停");
- ui->pushButton_stop_cont->setEnabled(true);
- }
ALSA (Advanced Linux Sound Architecture 高级的 Linux 声音体系),目前已经成为了 linux下的主流音频体系架构, 提供了音频和 MIDI 的支持,替代了原先旧版本中的 OSS;ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架, 这套框架的设计本身是比较复杂的, 采用分离、分层思想设计而成。

在应用层, ALSA 提供了一套标准的 API,应用程序只需要调用这些 API 就可完成对底层音频硬件设备的控制, 譬如播放、录音等, 这一套 API 称为 alsa-lib。
Linux下有一个开源的音频库,alsa库,实现了录音的功能,alsa库包含如下内容:
alsa-lib-1.0.22.tar.bz2 :alsa核心支持库
alsa-utils-1.0.22.tar.bz2 :alsa的工具库
使用alsa实现录音和播放:
录音:arecord -d10 -c1 -r16000 -twav -fS16_LE xxx.WAV
-d:录音时间
-c:音轨
-r:采样频率
-t:封装格式
-f:量化位数
播放:aplay xxx.WAV
ui设计

myaudio.h
- #ifndef MYAUDIO_H
- #define MYAUDIO_H
-
- #include
- #include
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class MyAudio; }
- QT_END_NAMESPACE
-
- class MyAudio : public QWidget
- {
- Q_OBJECT
-
- public:
- MyAudio(QWidget *parent = nullptr);
- ~MyAudio();
-
- private slots:
- void on_pushButton_record_clicked();
-
- void on_pushButton_play_clicked();
-
- private:
- Ui::MyAudio *ui;
- QProcess *p;
- };
- #endif // MYAUDIO_H
myaudio.cpp
- #include "myaudio.h"
- #include "ui_myaudio.h"
-
- MyAudio::MyAudio(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::MyAudio)
- {
- ui->setupUi(this);
-
- p = new QProcess(this);
-
- //连接进程结束的信号
- connect(p,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this,[&](int exitCode, QProcess::ExitStatus exitStatus){
- ui->pushButton_record->setText("录音");
- });
- }
-
- MyAudio::~MyAudio()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
- }
-
- delete ui;
- }
-
- //录音
- void MyAudio::on_pushButton_record_clicked()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
-
- ui->pushButton_record->setText("录音");
- }
- else{
- QString cmd = "arecord";
- QStringList args;
-
- args<<"-d30"<<"-c1"<<"-r16000"<<"-twav"
- <<"-fS16_LE"<<"test.WAV"<<"&";
-
- p->start(cmd,args);
-
- ui->pushButton_record->setText("停止");
- }
- }
-
- //播放
- void MyAudio::on_pushButton_play_clicked()
- {
- if(p->state()==QProcess::Running){
- p->kill();
- p->waitForFinished();
-
- ui->pushButton_record->setText("录音");
- }
-
- QString cmd = "aplay";
- QStringList args;
-
- args<<"test.WAV"<<"&";
-
- p->start(cmd,args);
- }
录音完成进程信号 :
- //p为进程
- connect(p,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this,[&](int exitCode, QProcess::ExitStatus exitStatus){
- //ui->pushButton_record->setText("录音");
- //录音完成要处理的动作
- });