首先界面如下:

1、在.pro文件中加入 QT += multimediawidgets

本例采用QAudioOutput + QIODevice 实现音频播放 ,构造一个派生自 QIODevice 的类,派生 QIODevice 实现两个纯虚函数

    qint64 readData(char *data, qint64 maxlen);qint64 writeData(const char *data, qint64 len);

soundsource.h

#ifndef SOUNDSOURCE_H
#define SOUNDSOURCE_H#include <QIODevice>
#include <QObject>class SoundSource : public QIODevice
{
public:SoundSource();SoundSource(int _fq, int _vol);void setFreq(int fq);void setVolume(int vol);protected:qint64 readData(char *data, qint64 maxlen);qint64 writeData(const char *data, qint64 len);
private:double frequency=1000;double volume=100;qint64 it=0;QList<char> m_data;void appendData();
};#endif // SOUNDSOURCE_H

soundsource.cpp

#include "soundsource.h"#define     SAMPLE_RATE         44100
#define     SAMPLE_COUNT        (SAMPLE_RATE * 0.5)   /* 0.5 seconds */
#define     AMPLITUDE           (1.0 * 0x7F00)
#define     ONE_HZ           (1.0 / SAMPLE_RATE)SoundSource::SoundSource()
{}SoundSource::SoundSource(int _fq,int _vol)
{frequency=_fq;volume=_vol;
}void SoundSource::setFreq(int _fq){frequency=_fq;
}void SoundSource::setVolume(int _vol){volume=_vol;
}qint64 SoundSource::readData(char *data, qint64 maxlen){if(m_data.count()==0)appendData();qint64 count=qMin(maxlen,(qint64)m_data.count());for(qint64 i=0;i<count;i++)data[i]=m_data[i];m_data.erase(m_data.begin(),m_data.begin()+count);return count;
}qint64 SoundSource::writeData(const char *data, qint64 len){for(qint64 i=0;i<len;i++)m_data.push_back(data[i]);return len;
}void SoundSource::appendData(){for(qint64 i=it;i<it+SAMPLE_COUNT;i++){short temp=(volume/100)*AMPLITUDE * sin (frequency* ONE_HZ * 2 * i * M_PI) ;m_data.append((char)temp);m_data.append((char)(temp>>8));m_data.append((char)temp);m_data.append((char)(temp>>8));}it+=SAMPLE_COUNT;
}

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QSlider>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include "soundsource.h"class MainWidget : public QWidget
{Q_OBJECTvoid initialize();void setupUI();QSlider *fqSlider,*volSlider;QLabel *lb1,*lb2;QPushButton *playBtn,*stopBtn;QAudioOutput *audio;SoundSource *source;QHBoxLayout *lay1, *lay2, *lay3;QVBoxLayout *mainLay;QAudioFormat defaultFormat(){QAudioFormat audioFormat;audioFormat.setCodec("audio/pcm");audioFormat.setByteOrder(QAudioFormat::LittleEndian);audioFormat.setSampleRate(44100);audioFormat.setChannelCount(2);audioFormat.setSampleSize(16);audioFormat.setSampleType(QAudioFormat::SignedInt);return audioFormat;}
public:explicit MainWidget(QWidget *parent = nullptr);signals:public slots:void slotPlay();void slotStop();void slotFqChanged(int t);void slotVolChanged(int t);
};#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{initialize();setupUI();audio = new QAudioOutput(QAudioDeviceInfo::defaultOutputDevice(),defaultFormat());source = new SoundSource(fqSlider->value(),volSlider->value());source->open(QIODevice::ReadWrite);connect(playBtn,SIGNAL(clicked()),this,SLOT(slotPlay()));connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStop()));connect(fqSlider,SIGNAL(valueChanged(int)),this,SLOT(slotFqChanged(int)));connect(volSlider,SIGNAL(valueChanged(int)),this,SLOT(slotVolChanged(int)));
}void MainWidget::slotFqChanged(int t){lb1->setText(QString("频率:%1").arg(t));source->setFreq(t);
}void MainWidget::slotVolChanged(int t){lb2->setText(QString("音量:%1").arg(t));source->setVolume(t);
}void MainWidget::slotPlay(){audio->start(source);
}void MainWidget::slotStop(){audio->stop();
}void MainWidget::initialize(){this->setFixedSize(400,240);fqSlider=new QSlider(Qt::Horizontal);fqSlider->setRange(0,15000);fqSlider->setValue(1000);volSlider=new QSlider(Qt::Horizontal);volSlider->setRange(0,100);volSlider->setValue(100);lb1=new QLabel("频率:1000");lb2=new QLabel("音量:100");lb1->setFixedWidth(120);lb2->setFixedWidth(120);playBtn=new QPushButton;stopBtn=new QPushButton;playBtn->setText("play");stopBtn->setText("stop");lay1=new QHBoxLayout;lay1->addWidget(lb1);lay1->addWidget(fqSlider);lay2=new QHBoxLayout;lay2->addWidget(lb2);lay2->addWidget(volSlider);lay3=new QHBoxLayout;lay3->addStretch();lay3->addWidget(playBtn);lay3->addStretch();lay3->addWidget(stopBtn);lay3->addStretch();mainLay=new QVBoxLayout;mainLay->addLayout(lay1);mainLay->addLayout(lay2);mainLay->addLayout(lay3);this->setLayout(mainLay);
}void MainWidget::setupUI(){}

main.cpp

#include "mainwidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWidget w;w.show();return a.exec();
}

资源地址:QAudioTest-CSDN下载  http://download.csdn.net/download/how0723/9958220

Qt5 QAudioOutput+QIODevice 播放固定频率的声音相关推荐

  1. android 播放固定频率的声音,Android 播放指定频率正弦波声音

    用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...

  2. android 播放固定频率的声音,Android 播放指定频率的纯音

    用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...

  3. android 播放固定频率的声音,Android使用SoundPool播放音效

    本文实例为大家分享了Android使用SoundPool播放音效的具体代码,供大家参考,具体内容如下 SoundPool(int maxStreams, int streamType, int src ...

  4. Android 播放指定频率正弦波声音

    用Android设备来播放指定频率的纯音,首先考虑到纯音是一种固定频率的声波,其实也就是正弦声波了.其实所有声音都是有正弦波组成,只不过纯音是固定频率的正弦波.那么要实现Andoird播放纯音,那么首 ...

  5. 使用matlab播放特定频率的声音

    A=2;%振幅 f_0=397%声音频率 fs=10000; %采样频率 N=3000; % 信号样点数,播放时长 y=A*sin(2*pi*f_0*(0:N-1)/fs); %单频信号 sound( ...

  6. html5 video 直播流无声音,【报Bug】html5plus 使用 VideoPlayer 播放部分rtmp没有声音

    详细问题描述 [内容] 使用 html5plus 使用 VideoPlayer 播放流媒体,播放m3u8格式正常,但rtmp格式部分有问题. 希望官方能确认是否是html5plus自身的缺陷呢,是否对 ...

  7. 如何过滤某一频率的声音

    1.如何过滤某一频率的声音?有没有什么软件? 2008-7-9 17:49 提问者: 阿蛋tiao | 浏览次数:1136次 玩游戏时枪声很吵,想把枪声过滤掉 问题补充: 比如说过滤掉X赫兹-Y赫兹的 ...

  8. 固定频率调用接口方案

    本文来源于一次工作中,对某第三方平台进行二次开发.这个第三方平台提供的接口有一个很扯淡的限制:限制每秒调用频率为最多2次.解决这个问题,有下面几个问题需要解决: 第三方调用频率策略修改,能快速修改,适 ...

  9. ]播放电影文件背景音乐声音正常对白声音小的问题

    [转载]播放电影文件背景音乐声音正常对白声音小的问题 (2010-04-11 17:30:01) 转载原文 <script></script>标签: 转载 谢谢你,这个问题困扰 ...

最新文章

  1. JVM 常见异常及内存诊断
  2. CentOS-创建yum本地源
  3. Client向Server send数据,返回WSAEWOULDBLOCK错误
  4. safehandle 和析构函数
  5. HDU4633(Polya计数)
  6. 高能预警!这些段子已刷爆大学老师朋友圈
  7. 目标检测的二十年发展史—从传统方法到深度学
  8. 聊聊在Go语言里使用继承的翻车经历
  9. 面试准备每日系列:计算机底层之并发编程(一)原子性、atomic、CAS、ABA、可见性、有序性、指令重排、volatile、内存屏障、缓存一致性、四核八线程
  10. Gentoo下cacti的安装
  11. 移动安全-iOS(三)
  12. fcntl函数的SET用法
  13. 51单片机入门学习 第九天
  14. 支持alpha通道的视频编码格式以及容器类型汇总
  15. 微软私有云服务器,微软发布私有云解决方案及数据平台
  16. linux 中的 usr 是什么含义
  17. 2022 年十大绩效考核技巧
  18. mysql左连接查询分页_mysql多表关联查询分页如何优化?-问答-阿里云开发者社区-阿里云...
  19. php获取服务器运行时间差,解决php服务器时间差异
  20. curl 增加header_Curl发送header头信息

热门文章

  1. Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)
  2. Linux - 内存管理
  3. 北京工作居住证续签收紧_收紧网站的安全带:HTTP安全标题
  4. 转载 百度地图API二次开发小经验分享
  5. T48 原地实现矩阵的转置
  6. 3个月疫情倒闭了近90000家企业,为什么互联网公司每天都在招人?招聘一个程序员要多少成本
  7. python x y 下载_Python(x,y)的下载安装
  8. 卷积神经网络概念及使用 PyTorch 简单实现
  9. 珠穆朗玛币王:11月18日学会分辨 拒绝盲从
  10. 2008北京地铁线路图