AudioStreamGenerator

继承: AudioStream < Resource < RefCounted < Object

提供程序式声音生成工具的音频流。

描述

AudioStreamGenerator 是一种音频流,它自己并不播放声音,而是要用脚本来为它生成音频数据。另见 AudioStreamGeneratorPlayback

以下是用它来生成正弦波的例子:

GDScriptC#

  1. var playback # 存放 AudioStreamGeneratorPlayback。
  2. @onready var sample_hz = $AudioStreamPlayer.stream.mix_rate
  3. var pulse_hz = 440.0 # 声音波形的频率。
  4. func _ready():
  5. $AudioStreamPlayer.play()
  6. playback = $AudioStreamPlayer.get_stream_playback()
  7. fill_buffer()
  8. func fill_buffer():
  9. var phase = 0.0
  10. var increment = pulse_hz / sample_hz
  11. var frames_available = playback.get_frames_available()
  12. for i in range(frames_available):
  13. playback.push_frame(Vector2.ONE * sin(phase * TAU))
  14. phase = fmod(phase + increment, 1.0)
  1. [Export] public AudioStreamPlayer Player { get; set; }
  2. private AudioStreamGeneratorPlayback _playback; // 存放 AudioStreamGeneratorPlayback。
  3. private float _sampleHz;
  4. private float _pulseHz = 440.0f; // 音频波形的频率。
  5. public override void _Ready()
  6. {
  7. if (Player.Stream is AudioStreamGenerator generator) // Type as a generator to access MixRate.
  8. {
  9. _sampleHz = generator.MixRate;
  10. Player.Play();
  11. _playback = (AudioStreamGeneratorPlayback)Player.GetStreamPlayback();
  12. FillBuffer();
  13. }
  14. }
  15. public void FillBuffer()
  16. {
  17. double phase = 0.0;
  18. float increment = _pulseHz / _sampleHz;
  19. int framesAvailable = _playback.GetFramesAvailable();
  20. for (int i = 0; i < framesAvailable; i++)
  21. {
  22. _playback.PushFrame(Vector2.One * (float)Mathf.Sin(phase * Mathf.Tau));
  23. phase = Mathf.PosMod(phase + increment, 1.0);
  24. }
  25. }

上面的例子中,“AudioStreamPlayer”节点必须使用 AudioStreamGenerator 作为其流。fill_buffer 函数负责提供模拟正弦波的音频数据。

要执行实时音频频谱分析,见 AudioEffectSpectrumAnalyzer

注意:由于性能的限制,这个类最好在 C# 或者在利用 GDExtension 的编译语言中使用。如果你仍然想要在 GDScript 中使用这个类,请考虑使用 11,025 Hz 或 22,050 Hz 等较低的 mix_rate

教程

属性

float

buffer_length

0.5

float

mix_rate

44100.0


属性说明

float buffer_length = 0.5 🔗

  • void set_buffer_length(value: float)

  • float get_buffer_length()

要生成的缓冲区的长度,以秒为单位。较低的值会带来更少的延迟,但需要脚本更快地生成音频数据,从而导致 CPU 使用率增加,如果 CPU 跟不上,则音频破裂的风险更大。


float mix_rate = 44100.0 🔗

  • void set_mix_rate(value: float)

  • float get_mix_rate()

使用的采样率(单位:Hz)。更高的值对 CPU 要求更高,但会带来更好的质量。

在游戏中,常用的采样率有 110251600022050320004410048000

根据奈奎斯特–香农采样定理,当超过 40000 赫兹时,人类的听觉没有质量上的差别(因为大多数人最多只能听到 ~20000 赫兹,往往更少)。如果你要生成语音等音高较低的声音,则可以使用 3200022050 等较低的采样率,不会降低质量。