Qt显示wav波形图
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波形图相关推荐
- 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; ...
- QT播放Wav音频并显示波形
1.前言 因为项目需要,做了个小工具来做前期准备. 这个需求实现两步:播放和显示波形. 播放方面,一开始选择FMod,小工具快做好的时候偶然发现FMod需要商业授权,所以只能放弃.试了试ffmpeg+ ...
- Qt 之 WAV文件解析
简介 最近看了一下Qt的处理音频方面的资料,本身利用QAudioInput 和 QAudioOutput 就可以实现录音和播放功能,代码也很简单,但是录音生成的文件并不能用播放器打开,就算更改后缀名也 ...
- Qt 之 WAV文件属性计算(比特率、文件大小、文件时长)
简述 在 Qt 之 WAV文件解析 中给出了WAV文件属性的计算,具体包括文件大小.音频时长.比特率等属性,这里我们再次验证一下这些属性值的计算 . 在计算之前,我们要知道一下wav文件中的三个参数 ...
- (原创)基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示
在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...
- 【转】itk、vtk、qt 显示dicom 数据
转自:https://blog.csdn.net/Zzhouzhou237/article/details/107199076/ 以下代码实现了itk读取dicom数据,转换为vtkData,然后用Q ...
- linux qt显示gif图片,QT显示GIF图片
在QT中要显示GIF图片,不能通过单单的添加部件来完成. 还需要手动的编写程序. 工具:QT Creator 新建一个工程,我们先在designer中,添加一个QLabel部件. 如下图: 将QLab ...
- [imx6 VPU]硬解码+示例[ffmpeg获取海康rtsp h264流 QT显示]
0.说明: 1,代码基于imx6q.imx6dl已验证. 2,网上关于imx6 VPU的资料很少,遂从官方例程mxc_vpu_test里面活生生抽出来.主要是dec_test()里面提取,因为我只要解 ...
- 基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示
在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...
- USB摄像头图片采集+QT显示(二)
硬件平台:Digilent ZedBoard + USB 摄像头+HDMI显示器 开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 +Qt Creat ...
最新文章
- 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
- Python之调用JS的方式
- Python 中让你相见恨晚的 20 个骚操作
- python学习 (二十九) range函数
- 谷歌修复安卓System 组件中的多个 RCE 漏洞
- ISA 发布内网 NLB
- 经常出现正常运行Windows所需的文件已被替换成无法识别的版本
- python容器类型-字典
- preg_replace() 函数
- mysql怎么批量导入excel数据_phpmyadmin怎么批量导入excel数据到mysql
- java编码字数统计
- 【山大会议】多人视频通话 WebRTC 工具类搭建
- SpringBoot操作ES进行各种高级查询(值得收藏)
- win10显示未连接到网络,但是任然可以上网
- 概论_第4章__期望的定义和性质
- 菜根谭 全文及译文下载
- tenable公司B轮融资
- 服务器中木马病毒处理(CPU占用率很高)处理办法
- Spark:Jieba对数据库里提取的记录进行中文分词
- 品牌整合营销成主流,企业启用中文域名是大势所趋
热门文章
- 非线性薛定谔方程_现有光纤网络正被推向极限,未来怎么办?薛定谔波动方程来帮忙...
- 基于C#的ico图标制作与应用
- php矢量绘图,打算做一个开源的矢量绘图软件
- 如何在keil5中定义结构变量
- Minimum-Cost Spanning Tree
- html添加B站视频,iframe嵌入BiliBili视频方法B站视频外链
- UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】
- 打字测试软件 tt,打字测试(TT)
- L298N电机驱动模块的接线使用与代码实现
- 手工纸盒子_折纸盒与纸盒子的折法手工制作图解教程大全 - 纸艺网