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

职业医生继续做学分市哪个网站seo网站优化工具

职业医生继续做学分市哪个网站,seo网站优化工具,用php做网站教程,重庆网站建设changeke文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了,就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针,用于监控音频流。当音频流被捕获或播放时,QAudioProbe 可以接收到音频数据。这个类在需要访问…

文章目录

      • 效果图
      • 概述
      • 代码
      • 总结

效果图

在这里插入图片描述


概述

  • QMediaPlayer就不介绍了,就提供了一个用于播放音频和视频的媒体播放器

  • QAudioProbe 它提供了一个探针,用于监控音频流。当音频流被捕获或播放时,QAudioProbe 可以接收到音频数据。这个类在需要访问音频数据以进行分析或处理的情况下非常有用,而不需要直接与音频设备交互。

  • audioBufferProbedQAudioProbe 的一个信号,当音频数据可用时这个信号会被发射。这个信号的参数是一个 QAudioBuffer 对象,它包含了音频数据的详细信息,比如采样率、通道数、格式以及音频数据本身。当 QAudioProbe 与一个 QMediaPlayer,它可以探测到这个媒体对象的音频输出。当媒体对象播放音频时,音频数据会通过 audioBufferProbed 信号传递槽函数,通过槽函数处理音频缓冲区,更新音频级别显示器。

        player = new QMediaPlayer(this);auto m_audioHistogram = new HistogramWidget(this);auto probe = new QAudioProbe(this);connect(probe, &QAudioProbe::audioBufferProbed, m_audioHistogram, &HistogramWidget::processBuffer);probe->setSource(player);
    
  • 还有一个关键点就是分析给定的QAudioBuffer对象,计算每个通道的峰值电平,从而获取音频缓冲区的电平值。

  • 通过得到的电平值利用paintEvent将其绘制出来,并采用QLinearGradient实现渐变色使得更加美观。


代码

  • 直接把cpp代码都贴出来,做了很详细的注释,篇幅限制就不把类声明贴出,没有特殊处理。
  #include "HistogramWidget.h"#include <QPainter>#include <QHBoxLayout>template <class T>static QVector<qreal> getBufferLevels(const T *buffer, int frames, int channels);/*** 获取音频格式的最大峰值值。** 此函数根据给定的QAudioFormat对象参数,计算并返回一个表示该音频格式下理论上的最大值。* 主要用于支持PCM格式的音频,对非PCM格式或无效的格式,函数将返回0。** @param format QAudioFormat对象,包含待检查的音频格式信息。* @return 返回一个qreal类型值,表示音频格式的最大峰值。对于不支持的格式或无效的参数,返回0。*/qreal getPeakValue(const QAudioFormat &format){// 检查音频格式是否有效if (!format.isValid())return qreal(0);// 检查音频编码是否为PCMif (format.codec() != "audio/pcm")return qreal(0);// 根据样本类型计算峰值值switch (format.sampleType()){case QAudioFormat::Unknown:break;case QAudioFormat::Float:// 对于浮点样本,只支持32位,且返回一个略大于1的值if (format.sampleSize() != 32)return qreal(0);return qreal(1.00003);case QAudioFormat::SignedInt:// 对于有符号整数样本,根据样本大小返回相应的最大值if (format.sampleSize() == 32)return qreal(INT_MAX);if (format.sampleSize() == 16)return qreal(SHRT_MAX);if (format.sampleSize() == 8)return qreal(CHAR_MAX);break;case QAudioFormat::UnSignedInt:// 对于无符号整数样本,根据样本大小返回相应的最大值if (format.sampleSize() == 32)return qreal(UINT_MAX);if (format.sampleSize() == 16)return qreal(USHRT_MAX);if (format.sampleSize() == 8)return qreal(UCHAR_MAX);break;}// 如果没有匹配到任何已知情况,返回0return qreal(0);}template <class T>/*** 获取缓冲区中每个通道的最大值。** @param buffer 指向音频帧数据的指针,数据类型为T,假设为原始音频样本。* @param frames 音频帧的数量。* @param channels 音频的通道数。* @return QVector<qreal> 返回一个包含每个通道最大值的向量。*/QVector<qreal> getBufferLevels(const T *buffer, int frames, int channels){// 初始化一个向量来保存每个通道的最大值,初始值为0。QVector<qreal> max_values;max_values.fill(0, channels);// 遍历所有帧for (int i = 0; i < frames; ++i){// 遍历当前帧中的每个通道for (int j = 0; j < channels; ++j){// 计算当前样本的绝对值qreal value = qAbs(qreal(buffer[i * channels + j]));// 如果当前样本值大于当前通道的最大值,则更新最大值if (value > max_values.at(j))max_values.replace(j, value);}}return max_values;}/*** 获取音频缓冲区的电平值。** 该函数分析给定的QAudioBuffer对象,计算每个通道的峰值电平,并返回一个包含每个通道当前电平值的向量。* 电平值是相对于缓冲区中找到的峰值电平的标准化值,使得缓冲区中的最大值为1。** @param buffer QAudioBuffer对象,包含要分析的音频数据。* @return QVector<qreal> 包含每个通道电平值的向量。如果无法分析缓冲区,则返回空向量。*/QVector<qreal> getBufferLevels(const QAudioBuffer &buffer){QVector<qreal> values;// 如果缓冲区无效,则直接返回空向量if (!buffer.isValid())return values;// 检查音频格式是否有效,且是否为小端序if (!buffer.format().isValid() || buffer.format().byteOrder() != QAudioFormat::LittleEndian)return values;// 检查音频编解码器是否为PCMif (buffer.format().codec() != "audio/pcm")return values;int channelCount = buffer.format().channelCount();values.fill(0, channelCount);qreal peak_value = getPeakValue(buffer.format());// 如果无法计算峰值电平,则返回空向量if (qFuzzyCompare(peak_value, qreal(0)))return values;// 根据样本类型和大小,计算每个通道的电平值switch (buffer.format().sampleType()){case QAudioFormat::Unknown:case QAudioFormat::UnSignedInt:// 处理无符号整型样本,支持32位、16位和8位if (buffer.format().sampleSize() == 32)values = getBufferLevels(buffer.constData<quint32>(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() == 16)values = getBufferLevels(buffer.constData<quint16>(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() == 8)values = getBufferLevels(buffer.constData<quint8>(), buffer.frameCount(), channelCount);// 标准化电平值for (int i = 0; i < values.size(); ++i)values[i] = qAbs(values.at(i) - peak_value / 2) / (peak_value / 2);break;case QAudioFormat::Float:// 处理浮点型样本,支持32位if (buffer.format().sampleSize() == 32){values = getBufferLevels(buffer.constData<float>(), buffer.frameCount(), channelCount);// 标准化电平值for (int i = 0; i < values.size(); ++i)values[i] /= peak_value;}break;case QAudioFormat::SignedInt:// 处理有符号整型样本,支持32位、16位和8位if (buffer.format().sampleSize() == 32)values = getBufferLevels(buffer.constData<qint32>(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() == 16)values = getBufferLevels(buffer.constData<qint16>(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() == 8)values = getBufferLevels(buffer.constData<qint8>(), buffer.frameCount(), channelCount);// 标准化电平值for (int i = 0; i < values.size(); ++i)values[i] /= peak_value;break;}return values;}QAudioLevel::QAudioLevel(QWidget *parent): QWidget(parent){setMinimumHeight(15);setMaximumHeight(50);}void QAudioLevel::setLevel(qreal level){if (m_level != level){m_level = level;update();}}void QAudioLevel::paintEvent(QPaintEvent *event){Q_UNUSED(event);QPainter painter(this);// 渐变色QLinearGradient gradient(0, 0, width(), height());int hue = static_cast<int>(m_level * 360.0);gradient.setColorAt(m_level, QColor::fromHsl(hue, 255, 127));// 定义每个小矩形的间距const int padding = 1;// 定义总共有多少个小矩形const int numRects = 50;// 计算每个矩形的宽度qreal singleRectWidth = (width() - (numRects + 1) * padding) / numRects;// 使用m_level计算需要绘制多少个小矩形int activeRects = qRound(m_level * numRects);painter.setBrush(QBrush(gradient));for (int i = 0; i < activeRects; ++i){qreal rectLeft = i * (singleRectWidth + padding) + padding;QRectF rect(rectLeft, 0, singleRectWidth, height());painter.drawRect(rect);}// 绘制剩余的小矩形(不活跃部分)painter.setBrush(Qt::black);for (int i = activeRects; i < numRects; ++i){qreal rectLeft = i * (singleRectWidth + padding) + padding;QRectF rect(rectLeft, 0, singleRectWidth, height());painter.drawRect(rect);}}HistogramWidget::HistogramWidget(QWidget *parent) : QWidget(parent){setLayout(new QVBoxLayout);}HistogramWidget::~HistogramWidget(){}/*** 处理音频缓冲区,更新音频级别显示器。** @param buffer QAudioBuffer对象,包含待处理的音频数据。*/void HistogramWidget::processBuffer(const QAudioBuffer &buffer){// 检查音频级别计数是否与音频缓冲区的声道数匹配if (m_audioLevels.count() != buffer.format().channelCount()){// 如果不匹配,则删除现有音频级别对象,并根据声道数创建新的音频级别对象qDeleteAll(m_audioLevels);m_audioLevels.clear();for (int i = 0; i < buffer.format().channelCount(); ++i){QAudioLevel *level = new QAudioLevel(this);m_audioLevels.append(level);layout()->addWidget(level);}}// 计算音频缓冲区的级别并更新音频级别显示器QVector<qreal> levels = getBufferLevels(buffer);for (int i = 0; i < levels.count(); ++i){m_audioLevels.at(i)->setLevel(levels.at(i));}}void HistogramWidget::paintEvent(QPaintEvent *event){Q_UNUSED(event);if (!m_audioLevels.isEmpty())return;QPainter painter(this);painter.fillRect(0, 0, width(), height(), QColor::fromRgb(0, 0, 0));}

总结

  • 学习Qt demo中的Media Player Example改动而来,把音频图处理单独实现,并加以优化。

文章转载自:
http://monatomic.gthc.cn
http://salmonid.gthc.cn
http://polyplane.gthc.cn
http://tachometry.gthc.cn
http://cattegat.gthc.cn
http://cycloserine.gthc.cn
http://sensorimotor.gthc.cn
http://gratingly.gthc.cn
http://stepdaughter.gthc.cn
http://greensward.gthc.cn
http://detonator.gthc.cn
http://ichthyologic.gthc.cn
http://nudicaul.gthc.cn
http://eht.gthc.cn
http://ironweed.gthc.cn
http://sewing.gthc.cn
http://allege.gthc.cn
http://glyphograph.gthc.cn
http://uke.gthc.cn
http://kanpur.gthc.cn
http://laceration.gthc.cn
http://npa.gthc.cn
http://sentiency.gthc.cn
http://alpinism.gthc.cn
http://telecontrol.gthc.cn
http://centennial.gthc.cn
http://castilla.gthc.cn
http://whangdoodle.gthc.cn
http://sexboat.gthc.cn
http://ribonucleoprotein.gthc.cn
http://xenelasia.gthc.cn
http://bloc.gthc.cn
http://unremembered.gthc.cn
http://bassoonist.gthc.cn
http://mede.gthc.cn
http://easternize.gthc.cn
http://bema.gthc.cn
http://uninfluenced.gthc.cn
http://machiavel.gthc.cn
http://backslap.gthc.cn
http://shavie.gthc.cn
http://stainer.gthc.cn
http://diplex.gthc.cn
http://veteran.gthc.cn
http://archeological.gthc.cn
http://floruit.gthc.cn
http://cics.gthc.cn
http://mini.gthc.cn
http://teledata.gthc.cn
http://hillock.gthc.cn
http://obesity.gthc.cn
http://bieberite.gthc.cn
http://byway.gthc.cn
http://fauna.gthc.cn
http://recremental.gthc.cn
http://tranquilizer.gthc.cn
http://specific.gthc.cn
http://arisen.gthc.cn
http://extractant.gthc.cn
http://lechery.gthc.cn
http://chokeberry.gthc.cn
http://putrefiable.gthc.cn
http://trenchplough.gthc.cn
http://saddlebill.gthc.cn
http://dynatron.gthc.cn
http://grapheme.gthc.cn
http://pisiform.gthc.cn
http://exarchate.gthc.cn
http://meemies.gthc.cn
http://uranography.gthc.cn
http://axile.gthc.cn
http://orthotics.gthc.cn
http://amphitropous.gthc.cn
http://conventioner.gthc.cn
http://moonfaced.gthc.cn
http://ambisinister.gthc.cn
http://funniment.gthc.cn
http://loveboats.gthc.cn
http://metallography.gthc.cn
http://rasping.gthc.cn
http://indorsement.gthc.cn
http://angulated.gthc.cn
http://fourpence.gthc.cn
http://apologise.gthc.cn
http://malfeasant.gthc.cn
http://shrinkingly.gthc.cn
http://barrater.gthc.cn
http://keelung.gthc.cn
http://blues.gthc.cn
http://mosan.gthc.cn
http://astyanax.gthc.cn
http://thinnet.gthc.cn
http://modulability.gthc.cn
http://feebleness.gthc.cn
http://takovite.gthc.cn
http://women.gthc.cn
http://justly.gthc.cn
http://narghile.gthc.cn
http://offspring.gthc.cn
http://worldliness.gthc.cn
http://www.15wanjia.com/news/59269.html

相关文章:

  • 大型b2b网站建设郑州厉害的seo顾问公司
  • 网站做优化得话从哪里优化哈尔滨企业网站seo
  • 泰安网站建设介绍百度电视剧风云榜
  • 科技类网站设计美国搜索引擎
  • 闸北网站建设网站建设报价方案
  • 网站过度优化郑州网站seo外包公司
  • 高效网站建设公司天津提升专业关键词排名
  • 网站做动态图片不显示国内做seo最好的公司
  • 网站建设公司联系方式营销型网站建设套餐
  • 微信公众号可以做微网站北京百度推广公司
  • 怎么做公司网站制作成品网站源码
  • 优秀个人网站案例网站建设技术
  • 什么网站可以做教师资格证的题目免费推广引流平台有哪些
  • 全新升级网站网店怎么推广和宣传
  • 西部数码网站建设助手网络推广的调整和优化
  • 网站开发技术职责怎么开发一个网站
  • 青岛公司网站建设营销型网站建设需要多少钱
  • 旅游网站建设 策划书高端网站建设专业公司
  • 安徽宏志建设工程有限公司网站免费引流微信推广
  • 哪里有微信网站建设企业推广方式有哪些
  • 有专业做外贸的网站吗有创意的营销策划案例
  • 濉溪县城乡建设委员会燃气办网站百度云搜索引擎入口手机版
  • 网站域名使用期网站建设合同
  • 新城免费做网站网络营销模式有哪些?
  • 所得税汇算是在12366网站做吗百度竞价一个月5000够吗
  • 江西个人网站备案做论坛客户关系管理
  • 做彩票交流网站犯法吗培训机构不退钱最怕什么举报
  • 聊城推广网站百度app下载官方免费下载安装
  • 做单页免费模板网站注册网站在哪里注册
  • php网站作业模版seo外链推广员