• 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布局:

     musicplayer.h文件

    1. #ifndef MUSICPLAYER_H
    2. #define MUSICPLAYER_H
    3. #include
    4. #include
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class MusicPlayer; }
    8. QT_END_NAMESPACE
    9. class MusicPlayer : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. MusicPlayer(QWidget *parent = nullptr);
    14. ~MusicPlayer();
    15. private slots:
    16. void on_pushButton_play_clicked();
    17. void on_pushButton_cancel_clicked();
    18. void on_pushButton_addmusic_clicked();
    19. void on_pushButton_deletemusic_clicked();
    20. void on_pushButton_clearmusic_clicked();
    21. void on_pushButton_stop_cont_clicked();
    22. void on_pushButton_prev_clicked();
    23. void on_pushButton_next_clicked();
    24. void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
    25. private:
    26. Ui::MusicPlayer *ui;
    27. QProcess *p;
    28. //记录正在播放的音乐
    29. QString current_music;
    30. };
    31. #endif // MUSICPLAYER_H

    musicplayer.cpp文件

    1. #include "musicplayer.h"
    2. #include "ui_musicplayer.h"
    3. #include
    4. MusicPlayer::MusicPlayer(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::MusicPlayer)
    7. {
    8. ui->setupUi(this);
    9. p = new QProcess(this);
    10. }
    11. MusicPlayer::~MusicPlayer()
    12. {
    13. if(p->state()==QProcess::Running){
    14. p->kill();
    15. p->waitForFinished();
    16. }
    17. delete ui;
    18. }
    19. //播放
    20. void MusicPlayer::on_pushButton_play_clicked()
    21. {
    22. //只有没有运行才开始播放
    23. if(p->state()==QProcess::Running){
    24. p->kill();
    25. p->waitForFinished();
    26. }
    27. QString cmd = QString("madplay");
    28. QStringList args;//参数
    29. current_music = ui->listWidget->currentItem()->text();
    30. args<"&";
    31. p->start(cmd,args);
    32. ui->pushButton_stop_cont->setText("暂停");
    33. ui->pushButton_stop_cont->setEnabled(true);
    34. }
    35. //停止
    36. void MusicPlayer::on_pushButton_cancel_clicked()
    37. {
    38. if(p->state()==QProcess::Running){
    39. p->kill();
    40. p->waitForFinished();
    41. }
    42. ui->pushButton_stop_cont->setText("暂停");
    43. ui->pushButton_stop_cont->setEnabled(false);
    44. }
    45. //添加音乐
    46. void MusicPlayer::on_pushButton_addmusic_clicked()
    47. {
    48. QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","/music","*.mp3 *.WAV");
    49. //去重
    50. for(int i=0;ilistWidget->count();i++){
    51. for(int j=0;jcount();j++){
    52. if(ui->listWidget->item(i)->text()==music_files.at(j)){
    53. music_files.removeAt(j);
    54. break;
    55. }
    56. }
    57. }
    58. //如果无添加文件,直接返回
    59. if(music_files.isEmpty())
    60. return;
    61. //添加到listWidget
    62. ui->listWidget->addItems(music_files);
    63. //定位
    64. ui->listWidget->setCurrentRow(0);
    65. }
    66. //删除音乐
    67. void MusicPlayer::on_pushButton_deletemusic_clicked()
    68. {
    69. int row = ui->listWidget->currentRow();
    70. //取出一项
    71. QListWidgetItem *item = ui->listWidget->takeItem(row);
    72. //删除的是正在播放的歌曲,停止播放
    73. if(item->text()==current_music){
    74. on_pushButton_cancel_clicked();
    75. }
    76. if(item){
    77. delete item;
    78. }
    79. }
    80. //清空
    81. void MusicPlayer::on_pushButton_clearmusic_clicked()
    82. {
    83. ui->listWidget->clear();
    84. on_pushButton_cancel_clicked();
    85. }
    86. //暂停
    87. void MusicPlayer::on_pushButton_stop_cont_clicked()
    88. {
    89. QString cmd = "killall";
    90. QStringList args;
    91. if(ui->pushButton_stop_cont->text()=="暂停"){
    92. args<<"-STOP"<<"madplay"<<"&";
    93. ui->pushButton_stop_cont->setText("继续");
    94. }
    95. else{
    96. args<<"-CONT"<<"madplay"<<"&";
    97. ui->pushButton_stop_cont->setText("暂停");
    98. }
    99. //阻塞执行
    100. p->execute(cmd,args);
    101. }
    102. //上一首
    103. void MusicPlayer::on_pushButton_prev_clicked()
    104. {
    105. int row = ui->listWidget->currentRow();
    106. if(row==0)
    107. row = ui->listWidget->count();
    108. row--;
    109. ui->listWidget->setCurrentRow(row);
    110. //播放下一首
    111. on_pushButton_play_clicked();
    112. }
    113. //下一首
    114. void MusicPlayer::on_pushButton_next_clicked()
    115. {
    116. int row = ui->listWidget->currentRow();
    117. if(row==ui->listWidget->count()-1)
    118. row = 0;
    119. else
    120. row++;
    121. ui->listWidget->setCurrentRow(row);
    122. //播放下一首
    123. on_pushButton_play_clicked();
    124. }
    125. void MusicPlayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
    126. {
    127. //只有没有运行才开始播放
    128. if(p->state()==QProcess::Running){
    129. p->kill();
    130. p->waitForFinished();
    131. }
    132. QString cmd = QString("madplay");
    133. QStringList args;//参数
    134. current_music = item->text();
    135. args<"&";
    136. p->start(cmd,args);
    137. ui->pushButton_stop_cont->setText("暂停");
    138. ui->pushButton_stop_cont->setEnabled(true);
    139. }

    二、mplayer

    1.mplayer指令

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

    使用指令:

    mplayer 视频文件路径

    参数:

    -quiet : 输出变化信息

    -slave :后台命令处理模式

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

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

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

    2.mplayer编程

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

    ui布局

     mymplayer.h

    1. #ifndef MYMPLAYER_H
    2. #define MYMPLAYER_H
    3. #include
    4. #include
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class MyMplayer; }
    8. QT_END_NAMESPACE
    9. class MyMplayer : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. MyMplayer(QWidget *parent = nullptr);
    14. ~MyMplayer();
    15. private slots:
    16. void on_pushButton_addvideo_clicked();
    17. void on_pushButton_deletevideo_clicked();
    18. void on_pushButton_clearvideo_clicked();
    19. void on_pushButton_play_clicked();
    20. void on_pushButton_cancel_clicked();
    21. void on_pushButton_stop_cont_clicked();
    22. void on_pushButton_prev_clicked();
    23. void on_pushButton_next_clicked();
    24. void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
    25. private:
    26. Ui::MyMplayer *ui;
    27. QProcess *p;
    28. //记录正在播放的视频
    29. QString current_video;
    30. };
    31. #endif // MYMPLAYER_H

    mymplayer.cpp

    1. #include "mymplayer.h"
    2. #include "ui_mymplayer.h"
    3. #include
    4. #include
    5. #include
    6. MyMplayer::MyMplayer(QWidget *parent)
    7. : QWidget(parent)
    8. , ui(new Ui::MyMplayer)
    9. {
    10. ui->setupUi(this);
    11. p = new QProcess(this);
    12. }
    13. MyMplayer::~MyMplayer()
    14. {
    15. if(p->state()==QProcess::Running){
    16. p->kill();
    17. p->waitForFinished();
    18. }
    19. delete ui;
    20. }
    21. //添加视频
    22. void MyMplayer::on_pushButton_addvideo_clicked()
    23. {
    24. QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","/video","*.mp4 *.avi");
    25. //去重
    26. for(int i=0;ilistWidget->count();i++){
    27. for(int j=0;jcount();j++){
    28. if(ui->listWidget->item(i)->text()==video_files.at(j)){
    29. video_files.removeAt(j);
    30. break;
    31. }
    32. }
    33. }
    34. //如果无添加文件,直接返回
    35. if(video_files.isEmpty())
    36. return;
    37. //添加到listWidget
    38. ui->listWidget->addItems(video_files);
    39. //定位
    40. ui->listWidget->setCurrentRow(0);
    41. }
    42. //删除视频
    43. void MyMplayer::on_pushButton_deletevideo_clicked()
    44. {
    45. int row = ui->listWidget->currentRow();
    46. //取出一项
    47. QListWidgetItem *item = ui->listWidget->takeItem(row);
    48. //删除的是正在播放的歌曲,停止播放
    49. if(item->text()==current_video){
    50. on_pushButton_cancel_clicked();
    51. }
    52. if(item){
    53. delete item;
    54. }
    55. }
    56. void MyMplayer::on_pushButton_clearvideo_clicked()
    57. {
    58. ui->listWidget->clear();
    59. on_pushButton_cancel_clicked();
    60. }
    61. //播放
    62. void MyMplayer::on_pushButton_play_clicked()
    63. {
    64. //只有没有运行才开始播放
    65. if(p->state()==QProcess::Running){
    66. p->kill();
    67. p->waitForFinished();
    68. }
    69. QString cmd = QString("mplayer");
    70. QStringList args;//参数
    71. current_video = ui->listWidget->currentItem()->text();
    72. args<<"-quiet"<<"-slave"<<"-af"<<"volume=-10"<<"-zoom"
    73. <<"-x"<<"600"<<"-y"<<"360"<"&";
    74. p->start(cmd,args);
    75. ui->pushButton_stop_cont->setText("暂停");
    76. ui->pushButton_stop_cont->setEnabled(true);
    77. }
    78. //停止
    79. void MyMplayer::on_pushButton_cancel_clicked()
    80. {
    81. if(p->state()==QProcess::Running){
    82. p->kill();
    83. p->waitForFinished();
    84. }
    85. ui->pushButton_stop_cont->setText("暂停");
    86. ui->pushButton_stop_cont->setEnabled(false);
    87. ui->label->clear();
    88. }
    89. //暂停继续
    90. void MyMplayer::on_pushButton_stop_cont_clicked()
    91. {
    92. QString cmd = "killall";
    93. QStringList args;
    94. if(ui->pushButton_stop_cont->text()=="暂停"){
    95. args<<"-STOP"<<"mplayer";
    96. ui->pushButton_stop_cont->setText("继续");
    97. }
    98. else{
    99. args<<"-CONT"<<"mplayer";
    100. ui->pushButton_stop_cont->setText("暂停");
    101. }
    102. //阻塞执行
    103. p->execute(cmd,args);
    104. }
    105. //上一首
    106. void MyMplayer::on_pushButton_prev_clicked()
    107. {
    108. int row = ui->listWidget->currentRow();
    109. if(row==0)
    110. row = ui->listWidget->count();
    111. row--;
    112. ui->listWidget->setCurrentRow(row);
    113. //播放下一首
    114. on_pushButton_play_clicked();
    115. }
    116. //下一首
    117. void MyMplayer::on_pushButton_next_clicked()
    118. {
    119. int row = ui->listWidget->currentRow();
    120. if(row==ui->listWidget->count()-1)
    121. row = 0;
    122. else
    123. row++;
    124. ui->listWidget->setCurrentRow(row);
    125. //播放下一首
    126. on_pushButton_play_clicked();
    127. }
    128. //双击播放
    129. void MyMplayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
    130. {
    131. //只有没有运行才开始播放
    132. if(p->state()==QProcess::Running){
    133. p->kill();
    134. p->waitForFinished();
    135. }
    136. QString cmd = QString("mplayer");
    137. QStringList args;//参数
    138. current_video = item->text();
    139. args<<"-quiet"<<"-slave"<<"-af"<<"volume=-10"<<"-zoom"
    140. <<"-x"<<"600"<<"-y"<<"360"<"&";
    141. p->start(cmd,args);
    142. ui->pushButton_stop_cont->setText("暂停");
    143. ui->pushButton_stop_cont->setEnabled(true);
    144. }

     三、ALSA

    1.ALSA简介

    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

    2.ALSA编程

    ui设计

     myaudio.h

    1. #ifndef MYAUDIO_H
    2. #define MYAUDIO_H
    3. #include
    4. #include
    5. QT_BEGIN_NAMESPACE
    6. namespace Ui { class MyAudio; }
    7. QT_END_NAMESPACE
    8. class MyAudio : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. MyAudio(QWidget *parent = nullptr);
    13. ~MyAudio();
    14. private slots:
    15. void on_pushButton_record_clicked();
    16. void on_pushButton_play_clicked();
    17. private:
    18. Ui::MyAudio *ui;
    19. QProcess *p;
    20. };
    21. #endif // MYAUDIO_H

    myaudio.cpp

    1. #include "myaudio.h"
    2. #include "ui_myaudio.h"
    3. MyAudio::MyAudio(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::MyAudio)
    6. {
    7. ui->setupUi(this);
    8. p = new QProcess(this);
    9. //连接进程结束的信号
    10. connect(p,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this,[&](int exitCode, QProcess::ExitStatus exitStatus){
    11. ui->pushButton_record->setText("录音");
    12. });
    13. }
    14. MyAudio::~MyAudio()
    15. {
    16. if(p->state()==QProcess::Running){
    17. p->kill();
    18. p->waitForFinished();
    19. }
    20. delete ui;
    21. }
    22. //录音
    23. void MyAudio::on_pushButton_record_clicked()
    24. {
    25. if(p->state()==QProcess::Running){
    26. p->kill();
    27. p->waitForFinished();
    28. ui->pushButton_record->setText("录音");
    29. }
    30. else{
    31. QString cmd = "arecord";
    32. QStringList args;
    33. args<<"-d30"<<"-c1"<<"-r16000"<<"-twav"
    34. <<"-fS16_LE"<<"test.WAV"<<"&";
    35. p->start(cmd,args);
    36. ui->pushButton_record->setText("停止");
    37. }
    38. }
    39. //播放
    40. void MyAudio::on_pushButton_play_clicked()
    41. {
    42. if(p->state()==QProcess::Running){
    43. p->kill();
    44. p->waitForFinished();
    45. ui->pushButton_record->setText("录音");
    46. }
    47. QString cmd = "aplay";
    48. QStringList args;
    49. args<<"test.WAV"<<"&";
    50. p->start(cmd,args);
    51. }

     录音完成进程信号 :

    1. //p为进程
    2. connect(p,QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this,[&](int exitCode, QProcess::ExitStatus exitStatus){
    3. //ui->pushButton_record->setText("录音");
    4. //录音完成要处理的动作
    5. });

  • 相关阅读:
    OSPF —— LSA-3
    【Spring AOP】暴力打通两个切面之间的通信
    考华为HCIP证书多钱?
    境外电商平台对接API相关文档
    java初阶——数据类型与运算符
    java学习day51(SSM)SSM综合练习需求与表结构
    二叉树:有了如此高效的散列表,为什么还需要二叉树?
    Java SE 18 新增特性
    8月8日下午6:00面试总结
    Peter算法小课堂—归并排序
  • 原文地址:https://blog.csdn.net/qq_53144843/article/details/126598969