版本: Unity 6 (6000.0)
语言英语
  • C#

AudioClip.GetData

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实阅读了用户提出的每一项更改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

声明

public bool GetData(Span<float> data, int offsetSamples);

声明

public bool GetData(float[] data, int offsetSamples);

描述

用剪辑中的样本数据填充数组。

样本数据将包含范围在 -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); } }