Wav 音频波形显示

本文讲述了作者在处理不同wav文件格式时遇到的问题,涉及音频数据解析、chunk结构理解及代码优化。通过GitHub库的扩展,解决了不同chunk类型的音频数据读取,最终简化了数据流程:wav->bytes->sampledata->texture。
摘要由CSDN通过智能技术生成

背景提要

由于需要画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文件的格式竟然就不一样。
1

2

按我找的格式图,完全不一样啊 ,这个JUNK是什么呢?

format

通过查阅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-data
 riff -50 - data

同样chunk之间还支持嵌套,有点像网络协议的格式。

甚至块内支持不同的编码格式,可以想象wav的设计很大程度是为了兼容和通用性。这个垃圾块单纯只是为了占位,很难想象全世界光这个垃圾块能占走多少资源。知道问题就比较好处理了。

解决

这就只需要修改解析模块的代码,让其支持到不同的chunk就可以。代码在github。我这里只关注了绘制所需要的datachunk,并且在操作上,可以省略转换wav到audioclip这一步。能稍微的优化一些。并在库里扩展了只获取采样数据的方法。

现在的流程是 wav->bytes->sampledata->textrue

参考:

riff

wiki

二进制文件查看工具hxd

github code

wav format


辣椒酱

2021.10.28

更多内容在博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值