qt 频谱 音乐播放器

先看效果

录制_2022_08_11_14_37_25_628

在网上找了一圈, 好多人写的资料敝竹自珍,还要收费真是无语。还有些需要用第三方库,真是没有必要。qt可以直接实现这些功能

音乐播放器的实现我就不贴了, 网上好多例子,我主要写下频谱的实现。

1. 获取波形数据

    // 音频获取probe = new QAudioProbe(this);connect(probe, &QAudioProbe::audioBufferProbed, this,&MainWindow::processBuffer);probe->setSource(music_player); // 传入音乐播放器void MainWindow::processBuffer(const QAudioBuffer &buffer)
{if(buffer.sampleCount() / 2 > 0)ui->label_boxingtu->drawAudioPxm(buffer);
}

2.  主界面上增加Qlabel 控件,新增一个类MyQLabel , 继承QLabel,做控件提升。

3. 在 MyQLabel 类中, 重写 paintEvent 。

MyQLabel::MyQLabel(QWidget *parent):QLabel(parent)
{graphicStyle = GraphicStyle::PingPu;
}void MyQLabel::drawAudioPxm(const QAudioBuffer &buffer)
{m_buffer = buffer;update();
}void MyQLabel::paintEvent(QPaintEvent *ev)
{int count = m_buffer.sampleCount() / 2;if(count <= 0)return;QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing);  // 抗锯齿if(graphicStyle == GraphicStyle::PingPu )drawWaveformFigure(painter);else if (graphicStyle == GraphicStyle::ZhuZhuangTu)drawHistogram(painter);else if (graphicStyle == GraphicStyle::ZhengTi)drawOverallVolatility(painter);
}// 频谱效果
void MyQLabel::drawWaveformFigure(QPainter &painter)
{const qint32 *data = m_buffer.constData<qint32>();int count = m_buffer.sampleCount() / 2;QPen pen = painter.pen();pen.setWidth(1);pen.setColor(Qt::blue);painter.setPen(pen);float xScale = (float)this->width() / count;float center = (float)this->height() / 2;for(int i = 1; i < count; i++){painter.drawLine((i - 1) * xScale,center + ((float)(data[i-1]) / INT_MAX * center),i * xScale,center + ((float)(data[i]) / INT_MAX * center) );}
}//  柱状图效果
void MyQLabel::drawHistogram(QPainter &painter)
{const qint32 *data = m_buffer.constData<qint32>();int count = m_buffer.sampleCount() / 2;int step = count / 50;QVector <qreal> vecData;for(int i = 0; i < 51; i++){int number = 0;qreal sum = 0;for (int j = 0; j < step; j++){if(i * 50 + j >= count)break;qreal value = (qreal)(data[i * 50 + j]) / INT_MAX * this->height();if(value > 0){sum += value;number++;}}if(number > 0)vecData.push_back(sum / number);elsevecData.push_back(0);}qreal rectangleWidth = (qreal)this->width() / vecData.count();   // 图形加间隙的宽度qreal clearanceWidth = rectangleWidth / 4;    // 间隙宽度qreal shapeWidth = rectangleWidth - clearanceWidth; // 图形宽度QPen pen = painter.pen();pen.setWidth(shapeWidth);pen.setColor(Qt::red);painter.setPen(pen);for(int i = 0; i < vecData.count(); i++){painter.drawLine(i * rectangleWidth + rectangleWidth* 0.5,this->height() - vecData[i],i * rectangleWidth + rectangleWidth* 0.5,this->height());}
}// 整体效果
void MyQLabel::drawOverallVolatility(QPainter &painter)
{const qint32 *data = m_buffer.constData<qint32>();int count = m_buffer.sampleCount() / 2;qreal maxValue = 0;  // 取最大值for(int i = 1; i < count; i++){qreal value = (qreal)(data[i]) / INT_MAX * this->height();maxValue = qMax(value,maxValue);}qreal rectangleWidth = (qreal)this->width() / 10;   // 图形加间隙的宽度qreal clearanceWidth = rectangleWidth / 4;    // 间隙宽度qreal shapeWidth = rectangleWidth - clearanceWidth; // 图形宽度for(int i = 0; i < 10; i++){QRect rect(i * rectangleWidth + clearanceWidth*0.5, 0, shapeWidth, this->height());QLinearGradient gradient(rect.x(), rect.y(),rect.x(), rect.y() + rect.height());gradient.setColorAt(0.0, Qt::red);gradient.setColorAt(0.3, Qt::green);gradient.setColorAt(0.6, Qt::yellow);gradient.setColorAt(1.0, Qt::blue);painter.setPen(Qt::NoPen);gradient.setSpread(QGradient::ReflectSpread);painter.setBrush(gradient); // QBrush(const QGradient &gradient)painter.drawRect(rect);// 去掉顶部QBrush brush = painter.brush();brush.setStyle(Qt::SolidPattern);brush.setColor(Qt::white);painter.setBrush(brush);painter.drawRect(i * rectangleWidth + clearanceWidth*0.5, 0, shapeWidth, this->height() - maxValue);}
}void MyQLabel::setGraphicStyle(const GraphicStyle &value)
{graphicStyle = value;
}

最近好多人照着我这个写完后运行报错,我在网上也查了下,应该是QT版本的兼容问题,下面是我用的 QT 版本信息, 上面的代码以及发的源码都是我自己写的,运行后没问题才发出来。

需要源码的,把邮箱留下,我看到后会给你发的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58001.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

功能扩展——邮件发送、网页注册

邮件收发 转自这位大佬 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是smtp.xxx…

网站注册邮件发送功能实现

摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址&#xff1a;一般是 smtp…

阿里巴巴国际站获得商品详情 API 调用分享(销量、详情图片、宝贝链接)

item_get-获得商品详情 alibaba.item_get 调用代码分享 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; imp…

利用用户搜索词生成商品标题信息——阿里巴巴IDST

今天介绍的论文是阿里IDST在2018年AAAI上发表的paper《A Multi-task Learning Approach for Improving Product Title Compression with User Search Log Data》。 其应用背景是&#xff0c;现在越来越多的用户开始习惯于使用手机、PAD等移动端进行网购行为&#xff0c;而这些移…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤&#xff1a; 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求&#xff0c;可以使用 GET 或 POST 方法&#xff0c;请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

中英文在线语音转文字的方法

今天小编就来给大家分享一个中英文在线翻译的方法&#xff0c;小编这个来给大家分享一个这样很好用的方法&#xff01; 操作方法&#xff1a; 使用工具&#xff1a;录音转文字助手 第一步&#xff1a;如果将手机录音转成文字的话需要使用一个工具&#xff1a;录音转文字助手&a…

实现语音转文字功能

解决方案 最近要实现语音转文字接口&#xff0c;具体需求是录制语音后再聊天室实时显示文字&#xff1a; 目前腾讯有三种解决方案&#xff1a; 实时语音识别使用场景是一边录语音&#xff0c;一遍转文字&#xff0c;实时性较高&#xff1b;一句话识别是对60s内的语音文…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

基于Matlab求解高铁运营公司列车开行优化问题

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

问题 A: 火车站(stack)

问题 A: 火车站(stack) 时间限制: 1 Sec 内存限制: 128 MB 提交: 251 解决: 137 [提交][状态][讨论版] 题目描述 火车站只有一条铁路&#xff0c;所有的火车都停在那里。所以所有的火车都是从一边进站&#xff0c;从另一边出站。如果A列先进入铁路&#xff0c;然后B列在A列离开…

PTA L2-014列车调度

PTAL2-014列车调度&#xff08;二分法/Set集合&#xff09; 两种方法解决该问题 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列…

UVA514 铁轨问题

问题描述 &#xff1a; PopPush城市有一座著名的火车站。这个国家到处都是丘陵。而这个火车站是建于上一个世纪。不幸的是&#xff0c;那时的资金有限。所以只能建立起一条路面铁轨。而且&#xff0c;这导致这个火车站在同一个时刻只能一个轨道投入使用&#xff0c;因为它缺少…

城市轨道交通的GoA

导言 目前轨道系统中最常见的便是基于通信的列车控制系统&#xff08;Communication Based Train Control, CBTC)&#xff0c;其中各集成商各条线路采用了不同级别的自动化技术&#xff0c;本文将针对CBTC的运用&#xff0c;从其系统组成、系统升级改造、系统主要功能、自动化…

铁路轨道不平顺数据分析与预测

铁路轨道不平顺数据分析与预测 1.引言 铁路轨道作为铁行车的基础设施&#xff0c;是铁路线路的重要组成部分。随着经济和交通运输业的发展&#xff0c;我国的铁路运输正朝着高速和重载方向迅速发展&#xff0c;与此同时&#xff0c;轨道结构承受来自列车荷载、运行速度的冲击…

铁轨问题 栈的运用

是这几天学习紫书遇到的一个问题 之前在学校的时候尝试着做过 题目如下 自己大概知道是这么个意思 C就相当于一个栈 进去的车厢只能倒着出来 后进去的就先出来 代码里不精 还是照着书上的打了一遍 花了一个下午理解了 #include<cstdio> #include<stack> usin…

栈的应用:火车调度问题

栈的应用&#xff1a;火车调度 问题概述 输入第一行是一个整数N&#xff0c;表示车厢的数量&#xff1b;第二行是一个由Y于R组成的字符串&#xff0c;表示车厢的排列&#xff0c;其中Y表示硬座&#xff0c;R表示软座。我们的任务&#xff0c;是借助一个栈&#xff0c;使得车厢…

火车进站问题-HDUOJ

火车进站问题 问题描述 假设杭州东火车站只有一条铁路&#xff0c;并且所有火车都从一侧进来&#xff0c;从另一侧出去。那么&#xff0c;如果火车A先进站&#xff0c;然后火车B在火车A离开之前就进站&#xff0c;那么火车A直到火车B离开后才能离开&#xff0c;可参见下图。 现…

深圳大学第三期“飞鹰计划”正式开班|学以致用,扬帆起航!

金秋九月&#xff0c;丹桂飘香&#xff0c;在这个充满着收获的季节里&#xff0c;迎来了期待已久的深圳大学机电与控制工程学院飞鹰计划2022级第三期开班典礼。受疫情影响&#xff0c;虽然典礼只能在线上举行&#xff0c;但是丝毫不影响电巢专家及学生们的热情。9月17日下午&am…

写了10 年的代码,收藏了这 20 个代码生成框架!

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 源码精品专栏 原创 | Java 2020 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…