You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:25:16