目录
一、madplay
1.madplay指令
2.mdaplay编程
二、mplayer
1.mplayer指令
2.mplayer编程
三、ALSA
1.ALSA简介
2.ALSA编程
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<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;ilistWidget->count();i++){
for(int j=0;jlistWidget->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<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;ilistWidget->count();i++){
for(int j=0;jlistWidget->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"<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"<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::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::of(&QProcess::finished),this,[&](int exitCode, QProcess::ExitStatus exitStatus){
//ui->pushButton_record->setText("录音");
//录音完成要处理的动作
});