用剪辑中的样本数据填充数组。
样本数据将包含范围在 -1.0f 到 1.0f 之间的浮点值。样本数量由 Span 或浮点数组的长度决定。使用 offsetSamples 参数从剪辑中的特定位置开始读取。如果从偏移量开始的读取长度超过剪辑长度,读取将循环并从剪辑的开头读取剩余的样本。
对于压缩音频文件,只有在 音频剪辑 导入器中将加载类型设置为加载时解压缩时,才能检索样本数据。GetData 不适用于流式音频剪辑,包括从磁盘流式传输的剪辑和使用AudioClip.Create创建的剪辑(其中stream参数已设置为true)。如果GetData无法读取音频剪辑,则data参数将包含所有样本值的零,控制台将记录错误,并且GetData将返回false。
为了获得最佳性能,建议使用 Span 版本,因为它不需要分配托管内存。
using UnityEngine; using Unity.Collections;
public class Example : MonoBehaviour { // Read all the samples from the clip and halve the gain void Start() { AudioSource audioSource = GetComponent<AudioSource>(); var numSamples = audioSource.clip.samples * audioSource.clip.channels; var samples = new NativeArray<float>(numSamples, Allocator.Temp); audioSource.clip.GetData(samples, 0);
for (int i = 0; i < samples.Length; ++i) { samples[i] = samples[i] * 0.5f; }
audioSource.clip.SetData(samples, 0); } }
WebGL:在 WebGL 平台上,音频剪辑的样本数据是异步加载的。这使得在读取样本数据之前检查 AudioClip 的loadState 成为必要。
using UnityEngine; using Unity.Collections; using System.Collections;
public class ExampleGetDataCoroutine : MonoBehaviour { void Start() { StartCoroutine(GetAudioData()); }
IEnumerator GetAudioData() { AudioSource audioSource = GetComponent<AudioSource>(); // Wait for sample data to be loaded while (audioSource.clip.loadState != AudioDataLoadState.Loaded) { yield return null; }
// Read all the samples from the clip and halve the gain var numSamples = audioSource.clip.samples * audioSource.clip.channels; var samples = new NativeArray<float>(numSamples, Allocator.Temp); audioSource.clip.GetData(samples, 0);
for (int i = 0; i < samples.Length; ++i) { samples[i] = samples[i] * 0.5f; }
audioSource.clip.SetData(samples, 0); } }