Wav 音频波形显示
背景提要
由于需要画wav文件的波形图,所以就需要拿到wav的波形数据,由于音频并非是在unity工程内的,所以数据源并非是导入后的AudioClip。Unity内部是有从audioclip拿数据画波形的方法的,但是奈何在引擎内部,涉及到C++层,使用多有不便。自己画倒也简单,先拿到采样数据,然后按数据量将数值画到texture上即可。所以主要是两个步骤。
获取wav采样数据
draw
整理数据转换流程就是 wav->bytes->audioclip->sampledata->textrue
wav的文件解析是件繁琐的事情,于是就上GitHub上找了个轻量的库,毕竟这种小需求,不想把整个NAudio导入。可以将wav转audioclip。然后在官方论坛里,找到绘制audioclip的方法,很轻松啊,整合一下就可以了,不愧是大自然的搬运工。
整体流程就是
wav->bytes->audioclip->sampledata->textrue
问题出现
但用了一段时间后,收到反馈有些音频显示正常,有些显示错误。奇了怪了,调试后发现
UInt16 audioFormat = BitConverter.ToUInt16 (fileBytes, position+4);
if (audioFormat != 1 && audioFormat != 65524) return null;
发现有些音频的format不为1,第一直觉认为是其他格式没被支持。通过对比二进制文件才发现不同wav文件的格式竟然就不一样。
按我找的格式图,完全不一样啊 ,这个JUNK是什么呢?
通过查阅riff发现wiki
Structure of the 'JUNK' chunk
To align RIFF chunks to certain boundaries (i.e. 2048bytes for CD-ROMs) the RIFF specification includes a JUNK chunk. Its contents are to be skipped when reading. When writing RIFFs, JUNK chunks should not have odd number as Size.
wav都是按照这种块结构排列的,基本结构都是
标识符-size-datariff -50 - data
同样chunk之间还支持嵌套,有点像网络协议的格式。
甚至块内支持不同的编码格式,可以想象wav的设计很大程度是为了兼容和通用性。这个垃圾块单纯只是为了占位,很难想象全世界光这个垃圾块能占走多少资源。知道问题就比较好处理了。
解决
这就只需要修改解析模块的代码,让其支持到不同的chunk就可以。代码在github。我这里只关注了绘制所需要的datachunk,并且在操作上,可以省略转换wav到audioclip这一步。能稍微的优化一些。并在库里扩展了只获取采样数据的方法。
现在的流程是 wav->bytes->sampledata->textrue
参考:
riff
wiki
二进制文件查看工具hxd
github code
wav format
辣椒酱
2021.10.28
更多内容在博客
Wav 音频波形显示相关推荐
- 【ae】蒙版描边、音频波形显示
1.用蒙版路径(不闭合的钢笔划线)作描边动画 2.描边效果加不到蒙版上,加载到图层一(视频层),然后设置到蒙版 3音频波形效果加到图层一 选择蒙版路径,音频层二作为音频来源 路径 在原始图像
- QT播放Wav音频并显示波形
1.前言 因为项目需要,做了个小工具来做前期准备. 这个需求实现两步:播放和显示波形. 播放方面,一开始选择FMod,小工具快做好的时候偶然发现FMod需要商业授权,所以只能放弃.试了试ffmpeg+ ...
- 前端vue可视化音频波形显示
本文主要用到了AudioContext.decodeAudioData()对象的方法开发者可通过这个api实现音频文件的解析再使用canvas绘制简单波形文件. 参考链接: AudioContext. ...
- matlab 播放声音,Matlab:实时播放音频并显示波形
目录标题 写在前面 先看效果 函数代码 写在前面 最近整理音频相关的资料,有时候需要根据音频的波形来人为地判断哪一段数据是可取的,哪一段又是该删掉的.这个小问题却连续困扰了我多日:普通的音频播放软件只 ...
- STM32实现DAC功能输出音频波形
目录 一.DAC简介 二.输出周期为2kHz的正弦波 三.音频信号输出 四.参考资料 一.DAC简介 DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它 ...
- Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...
- c语言 文件 long double 读取,读取*.wav音频文件
1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...
- 阿里云移动端播放器高级功能---截图和音频波形
基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来.另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示.如下 ...
- 阿里云移动端播放器高级功能---截图和音频波形 1
基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来.另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示.如下 ...
最新文章
- codeforces 165B(Burning Midnight Oil)
- js高级编程中命名空间的两种用法
- JAVA中通过Hibernate-Validation进行参数验证
- Python中运算符 is 和 == 的区别
- DLL引用之SQLite在Win32、64下的兼容
- MFC和OpenCV结合
- android抓包工具——使用fiddler4在安卓手机抓包
- 【转】开源的C# websocket-sharp组件解析
- ios设计规范(下)
- python filter_Python filter()
- 软件需求最佳实践pdf_| 专家观点 | 彭瑜:PackML成功的秘诀 ——简论软件定义包装过程的最佳实践...
- magic ui3.0是鸿蒙系统吗,magicui3.1更新内容要不要升级 magicui3.0新功能体验
- springmvc 需要用到的核心jar包
- CentOS中文乱码问题
- ssm-学子商城-项目第十一天
- Windows 7 极限精简 x86 x64 2018年度版
- 关键词词云怎么做_7个好用的在线词云生成工具
- python 图像格式转换文件夹下 jpg 转 bmp | 目录遍历
- PBR来龙去脉十一:IBL继续积分部分
- 06Java学习笔记——运算符
热门文章
- 在线重装Win11系统详细教程
- 数据库基础知识汇总!
- Proteus ISIS入门
- 大数据周会-本周学习内容总结012
- java 在方法中抛出异常_Java异常的抛出
- 感谢一起合作的小伙伴
- OpenGL编程指南2:环境搭配与第一个实例剖析
- linux下inet_addr函数,Linux下两个网络函数inet_addr和inet_network (2008-09-01 01:42)
- 从公务员转行网络安全工程师,铁饭碗也比不过“金饽饽”。
- ScheduleMaster分布式任务调度中心基本使用和原理