【QT】linux下alsa库的移植和QT中音视频的处理&笔记

一、音频的输入

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)工具库配置

扫描二维码关注公众号,回复: 14676889 查看本文章
./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;

    //添加到playlist
    for(int i=0;i<video_files.count();i++){
    
    
        QString file = video_files.at(i);
        playlist->addMedia(QUrl(file));
    }

    //添加到ListWid
    ui->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();
}

效果演示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43533553/article/details/123639752
今日推荐