Unity中AudioClip.Create()创建的音频剪辑无数据,SetData调用失败
解决Unity中AudioClip.Create()创建后无数据、SetData报错的问题
问题根源
AudioClip.Create()的第二个参数要求传入音频样本总数,而非字节数组的长度。你直接传f.Length(字节数)会导致Unity无法正确初始化AudioClip,最终所有属性(Samples、channels等)为0,调用SetData时自然报错。
解决步骤
1. 明确音频数据格式
先确认你的字节数组f对应的音频格式,比如常见的16位单声道PCM:
- 每个样本占2字节(16位=2字节)
- 单声道对应
channelCount=1
2. 计算正确的样本数
样本数 = 字节数组长度 / (每个样本的字节数 × 声道数)
以16位单声道为例:
int bytesPerSample = 2; // 16位PCM格式每个样本占2字节 int channelCount = 1; int sampleCount = f.Length / (bytesPerSample * channelCount);
3. 修正AudioClip创建代码
用计算出的sampleCount替换原来的f.Length:
AudioClip audioClip = AudioClip.Create(fileName, sampleCount, channelCount, 44100, false);
4. 将字节数组转换为float数组
AudioClip.SetData()要求传入float[]类型数据(范围-1到1),需要把16位PCM的字节转换为对应float值:
float[] audioData = new float[sampleCount]; for (int i = 0; i < sampleCount; i++) { // 读取16位小端模式的样本数据 short sampleValue = BitConverter.ToInt16(f, i * bytesPerSample); // 转换为-1到1之间的float值 audioData[i] = sampleValue / 32768f; }
5. 设置音频数据
现在再调用SetData就不会报错了:
audioClip.SetData(audioData, 0);
额外注意事项
- 如果是双声道音频,把
channelCount设为2,样本数计算也要对应调整 - 若音频是32位浮点格式,每个样本占4字节,转换逻辑需要改为直接读取float值
- 确保字节数组长度能被
bytesPerSample × channelCount整除,避免数据截断错误
内容的提问来源于stack exchange,提问作者Bones
相关产品推荐
相关产品推荐

