QT的音频操作---madplay &学习笔记

简介: QT的音频操作---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 &

测试代码:

#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);
}

效果:

相关文章
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
767 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
4月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
233 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
859 4
|
4月前
|
数据安全/隐私保护
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
436 4
|
4月前
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
140 4
|
4月前
|
API UED
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
497 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
316 3
|
4月前
|
数据可视化
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
100 3
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
651 3
|
4月前
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
156 3