关于Unity中AudioClip.GetData方法的若干技术疑问
Unity AudioClip.GetData 常见疑问解析
先看官方示例代码:
float[] samples = new float[audioClip.samples * audioClip.channels]; audioClip.GetData(samples, 0);
针对提出的三个问题,解答如下:
1. samples数组和音频数据的对应关系
- 数组里的每个
float值对应一个音频采样点的振幅,取值范围固定在**[-1.0f, 1.0f]**,0代表无声音,正负对应声波的振动方向。 - 多声道音频采用交错存储:比如双声道音频,数组顺序是「左声道第1采样 → 右声道第1采样 → 左声道第2采样 → 右声道第2采样」,以此循环;单声道的话,就按时间顺序依次存储每个采样点。
2. 为什么数组大小要乘以声道数
AudioClip.samples返回的是单声道的总采样数量,不是所有声道的总和。举个例子:2秒长、44100Hz采样率的双声道音频,单声道采样数是44100×2=88200,两个声道的总采样数就是88200×2=176400。- 如果数组大小不乘声道数,GetData只能读取单声道的部分数据,多声道的内容会被直接截断,导致获取的音频数据不完整。
3. samples数组是否和原音频完全对应?
- 只要你按照
audioClip.samples * audioClip.channels初始化数组,并且把offsetSamples参数设为0,那么数组第一个元素就是音频的起始采样点,最后一个元素就是音频的结尾采样点,和原音频数据完全匹配。 - 如果出现不匹配的情况,要么是数组容量不够,要么是
offsetSamples设了非0值(这个参数用来指定从音频的第N个采样点开始读取)。只要保证数组容量等于总采样数,且起始偏移为0,就能拿到完整的音频数据。
内容的提问来源于stack exchange,提问作者Foxhunt
相关产品推荐
相关产品推荐

