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

用asp做网站需要准备什么怎样使用模板建立网站

用asp做网站需要准备什么,怎样使用模板建立网站,上海市建设信息网官网,深圳微信网站制作文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了#xff0c;就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针#xff0c;用于监控音频流。当音频流被捕获或播放时#xff0c;QAudioProbe 可以接收到音频数据。这个类在需要访问… 文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针用于监控音频流。当音频流被捕获或播放时QAudioProbe 可以接收到音频数据。这个类在需要访问音频数据以进行分析或处理的情况下非常有用而不需要直接与音频设备交互。 audioBufferProbed 是 QAudioProbe 的一个信号当音频数据可用时这个信号会被发射。这个信号的参数是一个 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 QHBoxLayouttemplate class Tstatic QVectorqreal 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 QVectorqreal 返回一个包含每个通道最大值的向量。*/QVectorqreal getBufferLevels(const T *buffer, int frames, int channels){// 初始化一个向量来保存每个通道的最大值初始值为0。QVectorqreal 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 QVectorqreal 包含每个通道电平值的向量。如果无法分析缓冲区则返回空向量。*/QVectorqreal getBufferLevels(const QAudioBuffer buffer){QVectorqreal 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.constDataquint32(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() 16)values getBufferLevels(buffer.constDataquint16(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() 8)values getBufferLevels(buffer.constDataquint8(), 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.constDatafloat(), 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.constDataqint32(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() 16)values getBufferLevels(buffer.constDataqint16(), buffer.frameCount(), channelCount);if (buffer.format().sampleSize() 8)values getBufferLevels(buffer.constDataqint8(), 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_castint(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);}}// 计算音频缓冲区的级别并更新音频级别显示器QVectorqreal 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://www.dnsts.com.cn/news/43425.html

相关文章:

  • 口腔医院网站开发wordpress使用mysqli
  • 人力社保网站建设的意义酒厂网站源码
  • 广州市建设招标管理办公室网站品牌网站建设有哪些
  • 漯河网站建设公司阿里云服务器搭建网站
  • 应用软件设计过程seo推广培训资料
  • logo设计网站官网衡水电商网站建设价格
  • 网站建设与运营 试题屏蔽收索引擎抓取网站
  • 哪里网站用vue.js做的罗湖网站建设费用
  • 设计logo网站免费下载泰安推广工作室
  • 公司网站 域名 申请 空间如何一次性删除wordpress拉圾评论
  • 陕西网站建设企业网站认证打的钱怎么做分录
  • 做网站一排文字怎么水平对齐wordpress静态化经验
  • 网站内容更新教程wordpress 页眉修改
  • 门户网站属于什么类型的模式公司一定建设网站
  • 建设银网站百度网站的优缺点
  • 公司展示网站模板免费下载只做汽车的网站
  • 集约化网站建设项目西安网站开发招聘
  • 织梦手机网站模板删除不了自己怎么设计公主裙
  • 网站后台补丁如何做中国建设第一平台网站
  • 深圳婚庆网站建设广东省住房城乡建设厅门户网站
  • 排版设计模板网站网页设计实训方法步骤
  • 大气精美网站设计工作室织梦模板(附赠精美织梦后台模板)列出网站开发建设的步骤
  • 怎么做网站申请广告自媒体害了多少人
  • wap网站前台平面设计包括什么
  • 青岛网站建设多少钱163免费邮箱注册
  • 南昌建设医院网站网站备案是空间备案还是域名备案
  • 公司网站百度小程序开发wordpress 数据库类
  • php网站后台密码忘记如何优化标题关键词
  • dede本地搭建好网站后台密码和用户名是什么最专业企业营销型网站建设
  • 网站推广优化c重庆wordpress微信机器人高级版 免费