1.参考资料:

https://www.docin.com/p-1263172990.html

https://wenku.baidu.com/view/738ea046fd4ffe4733687e21af45b307e971f96f.html

2.涉及QT内容:

2.1 使用QMediaPlayer来播放音频。

    //在.pro文件中加入  QT       += multimediaQMediaPlayer player;QMediaPlaylist playlist;playlist.addMedia(QUrl("xx.wav"));player.setPlaylist(&playlist);player.play();player.pause();player.stop();

2.2 使用QPainter,QPixmap绘制波形图。

    QPixmap pixmap(100, 20);pixmap.fill(Qt::black);    QPainter painter(&pixamp);painter.drawLine(QLine());

3.波形图绘制原理。

注意:本文章只实现声道数为1,2,采样位数为8,16的wav非压缩(PCM)音频;

①根据绘制区域得到宽高,再得出绘制波形图的每条竖线需要N个采样点,然后N个连续采样点中取出最大值和最小值,然后比例计算竖线;

②获取采样位数为8时,数据大小范围为0~255,获取采样位数为16时,数据大小范围为-32768~32767.

关键源码:

    if (fileWav.endsWith(".wav", Qt::CaseInsensitive) && QFile(fileWav).exists()){if (m_qUnplay.width() == 0){return;}m_qUnplay.fill(Qt::black);QPainter painter1(&m_qUnplay);painter1.setPen(QColor(75, 243, 167));m_qPlaying.fill(QColor(98, 108, 123));QPainter painter2(&m_qPlaying);painter2.setPen(QColor(75, 243, 167));FILE* fp;if ((fp = fopen(fileWav.toLocal8Bit().toStdString().c_str(), "rb")) != nullptr){struct WavHead  //wave文件头格式{char chunkID[4];            //文档标识 固定值"RIFF"qint32 chunkSize;           //文件数据长度char format[4];             //文件格式类型 固定值为"WAVE"qint32 subChunk1ID;         //格式块标识   固定值为"fmt"qint32 subChunk1Size;       //格式块长度 取决于编码格式qint16 audioFormat;         //编码格式代码 (PCM/非压缩格式)qint16 numChannels;         //声道个数qint32 sampleRate;          //采样频率qint32 byteRate;            //传输速率qint16 blockRate;           //数据块对齐单位qint16 bitsPerSample;       //采样位数char subChunk2ID[4];qint32 subChunk2Size;}stuWavHead;fread(&stuWavHead, sizeof(stuWavHead), 1, fp);//只支持声道数为1,2的非压缩格式(PCM)if ((stuWavHead.numChannels != 1 && stuWavHead.numChannels != 2)|| stuWavHead.audioFormat != 1){return ;}int dataSize = stuWavHead.chunkSize - sizeof(stuWavHead) - 8;//样本总数int sampleCount = dataSize / NO_ZERO(stuWavHead.bitsPerSample / 8);//只去左声道样本sampleCount = sampleCount / stuWavHead.numChannels;//每条竖线的样本数int linePerSample = sampleCount / m_qPlaying.width();int minY = 0;int maxY = 0;if (stuWavHead.bitsPerSample == 8){quint8 data;quint8 min = 255;quint8 max = 0;int x = 0;for (int i = 1; i <= sampleCount; i++){fread(&data, 1, 1, fp);if (stuWavHead.numChannels == 2){fseek(fp, 1, SEEK_CUR);}if (min > data){min = data;}if (max < data){max = data;}if (i % linePerSample == 0){maxY = m_qPlaying.height() - max * m_qPlaying.height() / 255;minY = m_qPlaying.height() - min * m_qPlaying.height() / 255;painter1.drawLine(QPoint(x, minY), QPoint(x, maxY));painter2.drawLine(QPoint(x, minY), QPoint(x, maxY));qDebug() << "min:" << min;qDebug() << "max:" << max;min = 255;max = 0;x++;}}}else if (stuWavHead.bitsPerSample == 16){qint16 data;qint16 min = 32767;qint16 max = min + 1;int x = 0;for (int i = 1; i <= sampleCount; i++){fread(&data, 2, 1, fp);if (stuWavHead.numChannels == 2){fseek(fp, 2, SEEK_CUR);}if (min > data){min = data;}if (max < data){max = data;}if (i % linePerSample == 0){maxY = m_qPlaying.height() / 2 - max * m_qPlaying.height() / 65535;minY = m_qPlaying.height() / 2 - min * m_qPlaying.height() / 65535;painter1.drawLine(QPoint(x, minY), QPoint(x, maxY));painter2.drawLine(QPoint(x, minY), QPoint(x, maxY));min = 32767;max = min + 1;x++;}}}}}

效果:

Qt显示wav波形图相关推荐

  1. matlab显示wav波形图,matlab 分析wav波形

    [x,fs,bits]=wavread('d.wav', [1 5000]); % sound(x, fs, bits); N = length(x); n = 0 : N-1; t = n/fs; ...

  2. QT播放Wav音频并显示波形

    1.前言 因为项目需要,做了个小工具来做前期准备. 这个需求实现两步:播放和显示波形. 播放方面,一开始选择FMod,小工具快做好的时候偶然发现FMod需要商业授权,所以只能放弃.试了试ffmpeg+ ...

  3. Qt 之 WAV文件解析

    简介 最近看了一下Qt的处理音频方面的资料,本身利用QAudioInput 和 QAudioOutput 就可以实现录音和播放功能,代码也很简单,但是录音生成的文件并不能用播放器打开,就算更改后缀名也 ...

  4. Qt 之 WAV文件属性计算(比特率、文件大小、文件时长)

    简述 在 Qt 之 WAV文件解析 中给出了WAV文件属性的计算,具体包括文件大小.音频时长.比特率等属性,这里我们再次验证一下这些属性值的计算 . 在计算之前,我们要知道一下wav文件中的三个参数 ...

  5. (原创)基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

    在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...

  6. 【转】itk、vtk、qt 显示dicom 数据

    转自:https://blog.csdn.net/Zzhouzhou237/article/details/107199076/ 以下代码实现了itk读取dicom数据,转换为vtkData,然后用Q ...

  7. linux qt显示gif图片,QT显示GIF图片

    在QT中要显示GIF图片,不能通过单单的添加部件来完成. 还需要手动的编写程序. 工具:QT Creator 新建一个工程,我们先在designer中,添加一个QLabel部件. 如下图: 将QLab ...

  8. [imx6 VPU]硬解码+示例[ffmpeg获取海康rtsp h264流 QT显示]

    0.说明: 1,代码基于imx6q.imx6dl已验证. 2,网上关于imx6 VPU的资料很少,遂从官方例程mxc_vpu_test里面活生生抽出来.主要是dec_test()里面提取,因为我只要解 ...

  9. 基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

    在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...

  10. USB摄像头图片采集+QT显示(二)

    硬件平台:Digilent ZedBoard + USB 摄像头+HDMI显示器 开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 +Qt Creat ...

最新文章

  1. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
  2. Python之调用JS的方式
  3. Python 中让你相见恨晚的 20 个骚操作
  4. python学习 (二十九) range函数
  5. 谷歌修复安卓System 组件中的多个 RCE 漏洞
  6. ISA 发布内网 NLB
  7. 经常出现正常运行Windows所需的文件已被替换成无法识别的版本
  8. python容器类型-字典
  9. preg_replace() 函数
  10. mysql怎么批量导入excel数据_phpmyadmin怎么批量导入excel数据到mysql
  11. java编码字数统计
  12. 【山大会议】多人视频通话 WebRTC 工具类搭建
  13. SpringBoot操作ES进行各种高级查询(值得收藏)
  14. win10显示未连接到网络,但是任然可以上网
  15. 概论_第4章__期望的定义和性质
  16. 菜根谭 全文及译文下载
  17. tenable公司B轮融资
  18. 服务器中木马病毒处理(CPU占用率很高)处理办法
  19. Spark:Jieba对数据库里提取的记录进行中文分词
  20. 品牌整合营销成主流,企业启用中文域名是大势所趋

热门文章

  1. 非线性薛定谔方程_现有光纤网络正被推向极限,未来怎么办?薛定谔波动方程来帮忙...
  2. 基于C#的ico图标制作与应用
  3. php矢量绘图,打算做一个开源的矢量绘图软件
  4. 如何在keil5中定义结构变量
  5. Minimum-Cost Spanning Tree
  6. html添加B站视频,iframe嵌入BiliBili视频方法B站视频外链
  7. UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】
  8. 打字测试软件 tt,打字测试(TT)
  9. L298N电机驱动模块的接线使用与代码实现
  10. 手工纸盒子_折纸盒与纸盒子的折法手工制作图解教程大全 - 纸艺网