一、音频的输入

linux下有一个开源的音频库----alsa库,实现了录音的功能,alsa库包含如下内容:

alsa-lib-1.0.22.tar.bz2 ------- alsa的核心支持库
alsa-utils-1.0.22.tar.bz2----- alsa的工具库

百度网盘下载alsa库:
链接:https://pan.baidu.com/s/1_Obwr3kUQn_WNQQk6x87xA
提取码:sg73
1、移植alsa库
(移植三步曲):配置、编译、安装
(1)首先把下载好的压缩包放到非共享目录中解压,先移植核心支持库,再移植工具库(因为工具库依赖于支持库)

tar -xjvf xxx.tar.bz2


(2)核心支持库
1)配置

./configure --host=arm-linux --prefix=/home/gec/alsa --disable-python

2)编译

make

3)安装

make install

(3)移植工具库
1)工具库配置

./configure --host=arm-linux --prefix=/home/gec/alsa --with-alsa-prefix=/home/gec/alsa/lib --with-alsa-inc-prefix=/home/gec/alsa/include --disable-alsamixer --disable-xmlto

2)编译

make

3)安装

make install

注意:如果编译安装时报缺少某个文件的错误,直接手动在对应的目录下创建该文件

t-ja.gmo ------- alsaconf/po/t-ja.gmo
t-ru.gmo -------alsaconf/po/t-ru.gmo

(4)将编译生成的目录(alsa)打包,拷贝到开发板上解压,解压后将需要的文件拷贝到对应的目录中。

tar -cJvf alsa.tar.xz alsa

1)将三个库文件拷贝到/usr/lib中

cp alsa/lib/libasound.so* /usr/lib -r

2)将两个命令文件拷贝到/usr/bin中

cp alsa/bin/arecord alsa/bin/aplay /usr/bin -r

3)将配置文件拷贝到和Ubuntu中安装路径相同的位置

mkdir -p /home/gec/alsa
cp alsa/share /home/gec/alsa -r

(5)使用alsa实现录音和播放

arecord -d10 -c1 -r16000 -twav -fS16_LE xxx.WAV-d:录音时间-c:音轨-r:采样频率-t:封装格式-f:量化位数aplay xxx.WAV

二、Qt中的文字转语音

Qt5.8开始加入了文字转语音的模块,使用QTextToSpeech类,使用该类需要在项目文件中加入texttospeech模块(版本高于5.9)

QT += texttospeech

使用方法:
1、选择语音引擎

[static] QStringList QTextToSpeech::availableEngines();//构造QTextToSpeech对象时可以选择引擎
QTextToSpeech::QTextToSpeech(const QString &engine, QObject *parent = nullptr);

2、选择语言、声音类型、音量、音调、语速

3、转换

[slot] void QTextToSpeech::say(const QString &text);
//调用系统语音系统播放文本信息

测试代码:

#include "myspeech.h"
#include "ui_myspeech.h"MySpeech::MySpeech(QWidget *parent): QWidget(parent), ui(new Ui::MySpeech)
{ui->setupUi(this);tts = new QTextToSpeech(this);
}MySpeech::~MySpeech()
{delete ui;
}//播放
void MySpeech::on_pushButton_clicked()
{tts->say(ui->lineEdit->text());
}

三、QT中的视频处理

视频是由图片流和音频流组成,为了保证视频存储和传输的效率,需要对视频进行压缩(编码),视频的压缩分为帧内压缩和帧间压缩,对视频的压缩和解压就叫视频的编解码。

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

mplayer 视频文件路径
//需要将mplayer文件拷贝到开发板/usr/bin目录下(我用的开发板是GEC6818开发板)

百度网盘下载mplayer文件:

链接:https://pan.baidu.com/s/1jSZJ6uBPPs5ShanGyfCPnw
提取码:u9ub

mplayer在启动时可以添加选项控制

-quiet --------------- 不输出变换信息
-slave --------------- 后台命令获取模式
-geometry ------------ 在当前界面的指定位置播放(开发板无效)
-zoom -x ** -y ## ---- 指定播放分辨率
-af volume=xxx ------- 设置音量(-200 ~ +60)

注意:挂载开发板的空闲分区

1、格式化分区(只进行一次)
mkfs.vfat /dev/mmcblk0p7
2、挂载分区(创建一个空文件夹作为挂载点,每次启动都要执行)
mount -t vfat /dev/mmcblk0p7 挂载点(/Even)//如果希望自动挂载可以把挂载命令写入/etc/profile文件中

使用Qt界面控制mplayer,方法和madplay一样,唯一的区别需要预留播放视频图像的区域。
(2)QMediaPlayer
QMediaPlayer既可以播放播放音频,也可以播放视频,播放视频需要显示图像信息,需要指定显示的窗口。
1)QMediaPlayer视频显示
QMediaPlayer提供成员函数,指定视频输出窗口。

2)使用了视频播放窗口,需要在工程中添加以下的内容

//在工程文件中添加
QT += multimedia multimediawidgets
//在头文件中添加
#include <QVideoWidget>

其他的操作和QMediaPlayer音频播放完全一致

播放/停止
暂停/继续
上一个/下一个
音量控制
进度条
视频文件 添加/删除/清空

测试代码:

#include "myvideoplayer.h"
#include "ui_myvideoplayer.h"
#include <QFileDialog>MyVideoPlayer::MyVideoPlayer(QWidget *parent): QWidget(parent), ui(new Ui::MyVideoPlayer)
{ui->setupUi(this);player = new QMediaPlayer(this);playlist = new QMediaPlaylist(this);vw = new QVideoWidget(this);//将窗口放入布局管理器ui->horizontalLayout->addWidget(vw);//设置播放器的显示窗口player->setVideoOutput(vw);//设置播放模式playlist->setPlaybackMode(QMediaPlaylist::Loop);//循环播放//设置播放器的播放列表player->setPlaylist(playlist);//连接周期改变和进度改变的信号QObject::connect(player,&QMediaPlayer::durationChanged,this,[&](qint64 duration){//设置进度条的最大值ui->horizontalSlider->setRange(0,duration);//显示周期video_duration = QString("%1:%2:%3").arg(duration/1000/60/60,2,10,QChar('0')).arg(duration/1000/60%60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0'));ui->label_pos->setText(QString("00:00:00/%1").arg(video_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/%4").arg(position/1000/60/60,2,10,QChar('0')).arg(position/1000/60%60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')).arg(video_duration));});
}MyVideoPlayer::~MyVideoPlayer()
{delete ui;
}//添加视频
void MyVideoPlayer::on_pushButton_addvideo_clicked()
{QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","E:/GZ2142/11-Qt/Qt高级资料","*.mp3 *.mp4 *.avi *.WAV");//去重for(int i=0;i<ui->listWidget->count();i++){for(int j=0;j<video_files.count();j++){if(ui->listWidget->item(i)->text()==video_files.at(j)){video_files.removeAt(j);break;}}}//如果无添加直接返回if(video_files.isEmpty())return;//添加到playlistfor(int i=0;i<video_files.count();i++){QString file = video_files.at(i);playlist->addMedia(QUrl(file));}//添加到ListWidui->listWidget->addItems(video_files);//定位ui->listWidget->setCurrentRow(0);
}//删除视频
void MyVideoPlayer::on_pushButton_delvideo_clicked()
{int delrow = ui->listWidget->currentRow();//取出一项QListWidgetItem *item = ui->listWidget->takeItem(delrow);if(item)delete item;//从playlist中删除playlist->removeMedia(delrow);
}//清空视频
void MyVideoPlayer::on_pushButton_clearvideo_clicked()
{ui->listWidget->clear();playlist->clear();
}void MyVideoPlayer::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 MyVideoPlayer::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 MyVideoPlayer::on_pushButton_stopcont_clicked()
{ui->pushButton_stopcont->setEnabled(false);player->pause();
}//停止
void MyVideoPlayer::on_pushButton_kill_clicked()
{//禁止暂停按钮ui->pushButton_stopcont->setEnabled(false);player->stop();
}

效果演示:

【QT】linux下alsa库的移植和QT中音视频的处理笔记相关推荐

  1. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

    如有错误,欢迎大家指正,感谢! ​​​​​​​目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...

  2. linux下qt的文件打包,【最详细最完整】在Linux 下如何打包免安装的QT程序?

    版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! https://blog.csdn.net ...

  3. linux编译安装jpeg,Linux下JPEG库安装脚本(转)

    Linux下JPEG库安装脚本(转)[@more@]该脚本用于在Linux下安装JPEG库,在安装GD库的时候如果没有JPEG库,GD将不能生成JPEG格式的图象. 作者: 何志强#----where ...

  4. Linux下boost库的编译、安装详解

    1.下载源文件 去官网下载:http://www.boost.org/ 这里下载最新版本 wget https://dl.bintray.com/boostorg/release/1.64.0/sou ...

  5. linux 动态库建立,浅析linux下静态库和动态库的建立和使用

    在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...

  6. linux下编译libuv,linux下libuv库安装教程

    下载并编译libuv libuv需要自己手动下载源码,并手动编译. 当前目录为:/home/xlz/test/github/,在后面,会用$PATH来代替,我的系统的Debian8,64bit. $g ...

  7. 【Linux开发】Linux下jpeglib库的安装详解

    Linux下jpeglib库的安装详解 首先要下载所需的库压缩包:jpegsrc.v6b.tar.gz或 jpegsrc.v8b.tar.gz 然后将下载的压缩包随便放在和解压到你喜欢的地方. # t ...

  8. linux 更新软件命令 失败,对linux下软件(库)的更新命令详解

    在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别 pip用来安装来自PyPI( ...

  9. Linux下动态库的创建与更新

    Linux下动态库(libname.x.y.z)的创建与更新 由于主程序和它依赖的共享库是由不同的开发者开发的.共享库的开发者会不停地更新共享库的版本,以修正bug,增加功能或改进性能.版本多了之后, ...

最新文章

  1. keras Classifier 分类
  2. ES6实现一些常见算法
  3. springboot搭建的ssm项目
  4. 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)
  5. 图形学教程Lecture 14: RayTracing1(Acceleration Radiometry)知识点总结
  6. 光纤收发器按照网管怎么分类
  7. polymer中的sort和filter
  8. 5G关键技术:大规模多天线技术现状及研究点介绍
  9. 分享 :用五个趣味案例教你数据分析的基本思想
  10. CSU 1556 Pseudoprime numbers
  11. 可用性和可靠性的区别
  12. OpenWrt从下载到编译 -- 斐讯K2路由器
  13. WPF技巧(5)元素的加载与卸载(Loaded and Unloaded)
  14. LSA / LSI 算法
  15. 中兴笔试题目总结(一)C++部分
  16. 【软件测试】如何测试人工智能软件?
  17. 浏览器直接打开excle文件
  18. 导学目录-学如逆水行舟
  19. vCenter通过vMotion迁移虚拟机条件
  20. 推荐爱码哥移动开发平台十大常用的原生UI控件

热门文章

  1. Sam Altman 山姆奥特曼:关于生产率(工作效率)
  2. WatchOS开发教程之四: Watch与 iPhone的通信和数据共享
  3. 深度学习视觉系统在雪糕盒产品中的全方位识别检测
  4. 考研由考生编号估计学校,报考人数和专业
  5. PTA 7-59 二元一次方程的解
  6. 机器学习从入门到创业手记-处理数据的乐趣在于挖掘
  7. String类型的测量长度
  8. 小程序webview关注公众号_微信小程序和公众号互相跳转
  9. 《指弹:千与千寻:Always with me》
  10. 识别喜欢开发的程序员