Linux之音视频入门

目录

一、madplay

1.madplay指令

 2.mdaplay编程

二、mplayer

1.mplayer指令

2.mplayer编程

 三、ALSA

1.ALSA简介

2.ALSA编程



一、madplay

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 & 

 2.mdaplay编程

在Qt程序中启动进程(QProcess)播放madplay。

QProcess相关介绍:

start :启动

kill :停止

waitForFinished :等待结束

state:状态

excute(命令,参数):停止进程执行的内容等待执行完指定程序后继续执行原内容

 ui布局:

Linux之音视频入门_第1张图片

 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

1.mplayer指令

mplayer是一个免费开源的视频播放器,视频播放器提供视频解码并播放的功能,支持各种常见格式的视频,用法和madplay类似。

使用指令:

mplayer 视频文件路径

参数:

-quiet : 输出变化信息

-slave :后台命令处理模式

-geometry :指定播放位置(开发板无效)

-zoom -x ** -y ## :指定播放分辨率

-af volume=xxx :设置音量(-200 ~ +60)

2.mplayer编程

使用Qt界面控制mplayer,和控制madplay一样,唯一的区别是需要预留播放视频图像的区域

ui布局

Linux之音视频入门_第2张图片

 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

1.ALSA简介

ALSA (Advanced Linux Sound Architecture 高级的 Linux 声音体系),目前已经成为了 linux下的主流音频体系架构, 提供了音频和 MIDI 的支持,替代了原先旧版本中的 OSS;ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架, 这套框架的设计本身是比较复杂的, 采用分离、分层思想设计而成。

Linux之音视频入门_第3张图片

 在应用层, 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

2.ALSA编程

ui设计

Linux之音视频入门_第4张图片

 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("录音");
        //录音完成要处理的动作
    });    

你可能感兴趣的:(#,Linux应用开发,音视频)