当前位置: 首页 > news >正文

Qt播放音频,支持进度条,设置语速,播放暂停

原需求:

需要实现文字转语音功能,最开始采用的技术方法是QTextToSpeech,但是无法获取进度,导致出现很多的问题。

后面就改了方案,使用Windows自带的SAPI将文字转为音频,保存本地。

然后使用QMediaPlayer来播放音频。

QMediaPlayer比较强大,支持所有的需求(进度条、播放、暂停、继续播放、设置语速、设置音量)

 

 

Demo:

 

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>#include <QMediaPlayer>
#include <QMediaPlaylist>#include <QDir>
#include <QStandardPaths>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void fn_play();void fn_test();void fn_setRate(int rate);void fn_position(qint64 pos);void fn_duration(qint64 duration);private:Ui::Widget *ui;QMediaPlayer* player = nullptr;
};
#endif // WIDGET_H

 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 加载本地音频文件(不支持mp3,支持wmv)QString dir_path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);QString file_path = dir_path + "/1.wmv";player = new QMediaPlayer;player->setMedia(QUrl::fromLocalFile(file_path));connect(player, &QMediaPlayer::durationChanged, this, &Widget::fn_duration);connect(player, &QMediaPlayer::positionChanged, this, &Widget::fn_position);connect(ui->radioButton, &QRadioButton::clicked, this, [=](){fn_setRate(0);});connect(ui->radioButton_2, &QRadioButton::clicked, this, [=](){fn_setRate(1);});connect(ui->radioButton_3, &QRadioButton::clicked, this, [=](){fn_setRate(2);});connect(ui->pushButton, &QPushButton::clicked, this, &Widget::fn_bofang);connect(ui->pushButton_2, &QPushButton::clicked, this, &Widget::fn_test);
}Widget::~Widget()
{delete ui;
}void Widget::fn_bofang()
{if(player->state() == QMediaPlayer::StoppedState){ player->play(); }else if(player->state() == QMediaPlayer::PlayingState){ player->pause(); }else if(player->state() == QMediaPlayer::PausedState){ player->play(); }
}void Widget::fn_test()
{qDebug() << "rate:" << player->playbackRate();qDebug() << "state:" << player->state();
}void Widget::fn_setRate(int rate)
{if(rate == 0 ){player->setPlaybackRate(0.8);}if(rate == 1 ){player->setPlaybackRate(1.0);}if(rate == 2 ){player->setPlaybackRate(1.2);}
}void Widget::fn_position(qint64 pos)
{qDebug() << "pos:" << pos;ui->horizontalSlider->setValue(pos);
}void Widget::fn_duration(qint64 duration)
{qDebug() << "duration:" << duration;ui->horizontalSlider->setMinimum(0);ui->horizontalSlider->setMaximum(duration);
}

 

http://www.vanclimg.com/news/671.html

相关文章:

  • 使用监督学习训练图像聚类模型
  • java第二十八天
  • P2910 [USACO08OPEN] Clear And Present Danger S (Floyd算法)
  • 读《构建之法》:我的C/C++学习反思
  • 软工7.28
  • DE_aemmprty 题单合集(分类)
  • 《大道至简——软件工程实践者的思想》读后感
  • C++对象模型
  • 子串的故事(2) - 2025“钉耙编程”中国大学生算法设计暑期联赛(2)T4 题解
  • 【比赛记录】2025CSP-S模拟赛28
  • Apereo CAS 4.1 反序列化命令执行漏洞 (复现)
  • tt
  • 工程建立 - LI,Yi
  • Java基础语法学习 ———— Day1
  • 29
  • 第二十六天
  • 2025 -- 云智计划 -- 【CSP-S】模拟赛 #1_总结+题解
  • 习题-有限集
  • 人工智能驱动企业:通过情境感知AI重塑组织0引言
  • 亚马逊机器人如何应对交通拥堵
  • 00.01.Linux 应急响应:账号安全与入侵排查
  • 2025年7月28日
  • html重定向
  • 搜索结果太乱?5种重排序模型让你的搜索系统准确率提升40%
  • PCIe【6】SR-IOV
  • 服务器新手常见错误及网站搭建问题解析
  • Java面试见闻2025-7
  • 7月28日总结
  • 服务器外的文件,复制不到服务器上面
  • 数据资产到底值不值钱 - 智慧园区