背景提要

由于需要画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 音频波形显示相关推荐

  1. 【ae】蒙版描边、音频波形显示

    1.用蒙版路径(不闭合的钢笔划线)作描边动画 2.描边效果加不到蒙版上,加载到图层一(视频层),然后设置到蒙版 3音频波形效果加到图层一 选择蒙版路径,音频层二作为音频来源 路径 在原始图像

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

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

  3. 前端vue可视化音频波形显示

    本文主要用到了AudioContext.decodeAudioData()对象的方法开发者可通过这个api实现音频文件的解析再使用canvas绘制简单波形文件. 参考链接: AudioContext. ...

  4. matlab 播放声音,Matlab:实时播放音频并显示波形

    目录标题 写在前面 先看效果 函数代码 写在前面 最近整理音频相关的资料,有时候需要根据音频的波形来人为地判断哪一段数据是可取的,哪一段又是该删掉的.这个小问题却连续困扰了我多日:普通的音频播放软件只 ...

  5. STM32实现DAC功能输出音频波形

    目录 一.DAC简介 二.输出周期为2kHz的正弦波 三.音频信号输出 四.参考资料 一.DAC简介 DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它 ...

  6. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  7. c语言 文件 long double 读取,读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

  8. 阿里云移动端播放器高级功能---截图和音频波形

    基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来.另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示.如下 ...

  9. 阿里云移动端播放器高级功能---截图和音频波形 1

    基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来.另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示.如下 ...

最新文章

  1. codeforces 165B(Burning Midnight Oil)
  2. js高级编程中命名空间的两种用法
  3. JAVA中通过Hibernate-Validation进行参数验证
  4. Python中运算符 is 和 == 的区别
  5. DLL引用之SQLite在Win32、64下的兼容
  6. MFC和OpenCV结合
  7. android抓包工具——使用fiddler4在安卓手机抓包
  8. 【转】开源的C# websocket-sharp组件解析
  9. ios设计规范(下)
  10. python filter_Python filter()
  11. 软件需求最佳实践pdf_| 专家观点 | 彭瑜:PackML成功的秘诀 ——简论软件定义包装过程的最佳实践...
  12. magic ui3.0是鸿蒙系统吗,magicui3.1更新内容要不要升级 magicui3.0新功能体验
  13. springmvc 需要用到的核心jar包
  14. CentOS中文乱码问题
  15. ssm-学子商城-项目第十一天
  16. Windows 7 极限精简 x86 x64 2018年度版
  17. 关键词词云怎么做_7个好用的在线词云生成工具
  18. python 图像格式转换文件夹下 jpg 转 bmp | 目录遍历
  19. PBR来龙去脉十一:IBL继续积分部分
  20. 06Java学习笔记——运算符

热门文章

  1. 在线重装Win11系统详细教程
  2. 数据库基础知识汇总!
  3. Proteus ISIS入门
  4. 大数据周会-本周学习内容总结012
  5. java 在方法中抛出异常_Java异常的抛出
  6. 感谢一起合作的小伙伴
  7. OpenGL编程指南2:环境搭配与第一个实例剖析
  8. linux下inet_addr函数,Linux下两个网络函数inet_addr和inet_network (2008-09-01 01:42)
  9. 从公务员转行网络安全工程师,铁饭碗也比不过“金饽饽”。
  10. ScheduleMaster分布式任务调度中心基本使用和原理