音频资源 API#
FmodAudioStream#
继承自: Resource
表示用于 FMOD 播放的音频流的资源
描述#
FmodAudioStream 是一个资源,用于通过 FMOD 音频引擎播放音频数据。它支持从文件(包括 res:// 路径)加载音频,并提供可配置的创建模式以进行流式或基于样本的播放
可以使用 FmodAudioStreamPlayer 播放该流,也可以直接使用 FMOD 的通道系统。底层的 FmodSound 对象会在首次通过 get_sound() 请求时惰性创建
属性#
类型 |
名称 |
初始值 |
说明 |
|---|---|---|---|
audio_data |
PackedByteArray() |
从文件加载的原始音频数据。通常由音频导入器或通过 load_from_file() 设置。数据存储在内存中,并在调用 get_sound() 时用于创建 FMOD 声音对象 |
|
mode_flags |
1 |
创建模式标志,用于确定音频的加载和播放方式。这是 CreateMode 值的位掩码。当这些标志被更改时,内部的 FmodSound 会被释放,并将在下一次调用 get_sound() 时使用新的标志重新创建 |
方法#
void set_audio_data(data: PackedByteArray)#
设置音频原始数据。数据通常来自导入器、文件读取或运行时加载;设置后会更新数据加载状态。
PackedByteArray get_audio_data() const#
返回当前保存的音频原始数据。
void set_mode_flags(flags: int)#
设置创建 FmodSound 时使用的模式标志。修改后会使已缓存的声音失效,下次 get_sound() 会使用新标志重新创建。
int get_mode_flags() const#
返回当前创建模式标志。
FmodSound get_sound()#
返回此流的 FmodSound 对象,如有必要则创建它(懒创建)。声音会使用当前 mode_flags 创建。如果未加载音频数据或 FMOD 系统不可用,则返回空引用。
bool preload()#
立即创建并缓存内部 FmodSound,用于减少首次播放时的延迟。创建成功返回 true。
bool is_preloaded() const#
如果内部 FmodSound 已经创建并缓存,则返回 true。
float get_length() const#
返回音频的长度(以秒为单位)。如果声音未创建或未加载任何数据,则返回 0.0。
bool is_data_loaded() const#
如果音频数据已加载到此流中,则返回 true,否则返回 false。
FmodAudioStream load_from_file(path: String, flags: int = 1) static#
从文件路径加载音频流。路径可以是 Godot 资源路径(例如 "res://audio/music.mp3")或绝对文件路径。
flags 参数指定创建模式标志( CreateMode 的位掩码)。默认为 MODE_STREAM。
如果文件无法打开或读取,则返回一个空引用。
void clear()#
清除音频数据并释放内部 FmodSound 资源。这将释放内存并将流重置为空状态。
枚举#
CreateMode#
成员 |
值 |
说明 |
|---|---|---|
MODE_DEFAULT |
0 |
默认创建模式。没有设置特殊标志 |
MODE_STREAM |
1 |
从内存中流式传输音频。音频数据是逐步读取的,而不是一次性完全解码。这可以减少大文件的内存使用,但在播放时可能会增加 CPU 开销 |
MODE_SAMPLE |
2 |
将整个音频文件作为样本加载到内存中。这可以实现更快的播放和更低的 CPU 使用率,但会消耗更多内存。最适合短音效使用 |
MODE_LOOP |
4 |
启用正常循环播放。当音频播放到末尾时,它会回到开头重新播放 |
MODE_LOOP_BIDI |
8 |
启用双向(乒乓)循环播放。当音频播放到末尾时,它会向后播放到开始位置,然后再次向前播放,创建一个无缝的来回循环 |
示例#
从文件加载#
var stream: FmodAudioStream = FmodAudioStream.load_from_file("res://music/background.ogg", FmodAudioStream.MODE_STREAM)
var player: FmodAudioStreamPlayer = $FmodAudioStreamPlayer
player.stream = stream
player.play()
从文件加载#
var sfx: FmodAudioStream = FmodAudioStream.load_from_file("res://sfx/explosion.wav", FmodAudioStream.MODE_SAMPLE)
var player: FmodAudioStreamPlayer = $FmodAudioStreamPlayer
player.stream = sfx
player.play()
从内存加载#
var stream: FmodAudioStream = FmodAudioStream.new()
stream.audio_data = loaded_bytes
stream.mode_flags = FmodAudioStream.MODE_SAMPLE
FmodSound#
继承自: RefCounted
FMOD::Sound 的引用计数包装器,表示已加载的音频资源
描述#
FmodSound 是 FMOD::Sound 的一个 RefCounted 包装器,表示已加载的音频资源。它提供对音频元数据、格式信息、原始音频数据、追踪器格式(MOD/S3M/XM/IT/MIDI)的音乐专用控制以及元数据标签的访问
使用 load_from_file() 从磁盘加载音频,或通过 FmodSystem 方法创建音频。加载后,你可以查询音频信息、读取原始音频数据,或将其与 FmodChannel 一起用于播放
方法#
有效性检查#
bool sound_is_null() const#
如果声音实例未初始化或无效,则返回 true。这表示声音尚未准备好使用
bool sound_is_valid() const#
如果声音实例已成功初始化并且音效可用,则返回 true。这表示声音已准备好处理音频操作
格式信息#
Dictionary get_format() const#
返回一个包含声音格式信息的字典,包含以下键:
键名 |
类型 |
说明 |
|---|---|---|
type |
音频格式类型 |
|
format |
采样格式 |
|
channels |
声道数量 |
|
bits |
每个采样的位数 |
String get_name() const#
返回声音的名称。这通常是文件名或嵌入在音频文件中的名称
float get_length(time_unit: FmodSystem.FmodTimeUnit = 1) const#
返回指定时间单位的声音长度。当使用毫秒( FMOD_TIME_UNIT_MS )时,结果以秒为单位返回。对于其他单位如字节或 PCM 样本,则返回原始值
参见
FmodSystem.FmodTimeUnit 获取可用的时间单位选项
Dictionary get_tag(index: int, name: String = "") const#
从声音中检索元数据标签。可以通过索引或名称检索标签。如果名称非空,它将搜索具有该名称的标签;否则,它将检索指定索引处的标签
返回一个字典,包括:
键名 |
类型 |
说明 |
|---|---|---|
type |
标签类型 |
|
datatype |
标签值的数据类型 |
|
name |
标签名称 |
|
data |
标签值(类型根据 |
|
data_len |
数据的字节长度 |
|
updated |
如果标签已更新(用于流式来源),则为 |
数据读取#
Dictionary get_open_state() const#
返回声音的当前打开状态。这对于使用非阻塞标志打开的声音或监控流缓冲区状态非常有用。返回一个字典,包括:
键名 |
类型 |
说明 |
|---|---|---|
open_state: |
当前打开状态 |
|
percent_buffered |
流式声音缓冲区填充的百分比 |
|
starving |
如果流正在因数据不足而饥饿(缓冲区下溢),则为 |
|
disk_busy |
如果磁盘当前正在读取,则为 |
PackedByteArray read_data(length: int) const#
使用 FMOD 的内部编解码器将声音中的原始音频数据读取到 PackedByteArray 中。这对于提取解码后的 PCM 数据或进行自定义处理非常有用
备注
在读取之前使用 seek_data() 定位读取光标。
void seek_data(pcm: int)#
在声音中定位到特定的 PCM 位置以进行数据读取操作。该位置以 PCM 采样为单位指定
备注
这会影响 read_data() 使用的位置,而不会影响播放位置
FmodSoundLock lock(offset: int, length: int) const#
锁定声音的样本数据区域以进行直接访问。这允许读取或修改原始 PCM 数据。返回一个 FmodSoundLock 对象,该对象提供对锁定内存区域的访问
备注
始终确保 FmodSoundLock 被释放(超出作用域)以解锁数据
var lock = sound.lock(0, sound.get_length(FmodSystem.FMOD_TIME_UNIT_PCM))
# Access data through lock object
音乐#
int get_music_num_channels() const#
返回 MOD/S3M/XM/IT/MIDI 文件中的通道数量。每个通道对应模块文件中的一个轨道/乐器
备注
这仅适用于模块音乐格式(跟踪器格式)
void set_music_channel_volume(channel: int, volume_db: float) const#
设置 MOD/S3M/XM/IT/MIDI 文件中某个特定通道的音量,以分贝为单位。这允许对模块音乐中的每个音轨/乐器进行单独控制
备注
这仅适用于模块音乐格式。有效的通道索引范围为 0 到 get_music_num_channels() - 1
float get_music_channel_volume(channel: int) const#
返回 MOD/S3M/XM/IT/MIDI 文件中某个特定通道的音量,单位为分贝
备注
这仅适用于模块音乐格式。使用 get_music_num_channels() 来获取可用通道的数量
void set_music_speed(speed: float)#
设置 MOD/S3M/XM/IT/MIDI 音乐的相对播放速度。数值 1.0 为正常速度,0.5 为半速,2.0 为双倍速度,依此类推
备注
这仅适用于模块音乐格式(跟踪器格式)
float get_music_speed() const#
返回 MOD/S3M/XM/IT/MIDI 音乐的相对播放速度。数值 1.0 表示正常速度,小于 1.0 的数值表示较慢,大于 1.0 的数值表示较快
备注
这仅适用于模块音乐格式
同步/标记#
int get_sync_point(index: int) const#
返回指定索引处的同步点句柄。同步点是音频文件中的嵌入标记(例如,WAV 文件中的循环点或提示点)
备注
使用 get_sync_point_info() 获取返回的同步点句柄的信息
Dictionary get_sync_point_info(point: int, time_unit: FmodSystem.FmodTimeUnit = 1) const#
返回有关同步点的信息。point 参数应为从 get_sync_point() 获取的句柄。返回一个字典,其中包含:
键名 |
类型 |
说明 |
|---|---|---|
name |
同步点的名称 |
|
offset |
同步点在指定时间单位中的位置 |
|
time_unit |
用于偏移的时间单位 |
|
pointer |
同步点句柄 |
int get_num_sub_sounds() const#
返回多声音文件中的子声音数量。这对于像 FSB(FMOD 声音库)或 DLS(可下载声音)之类包含多个音频样本的格式非常有用
备注
像 MP3 或 WAV 这样的常规音频文件通常返回该值为 0
回调#
void set_pcmread_callback(callback: Callable)#
设置 PCM 读取回调函数。当 FMOD 需要更多音频数据进行解码和播放时,会调用此回调
回调函数签名: func callback(data: PackedByteArray, data_len: int) -> int
data—— FMOD 提供的用于填充音频数据的缓冲区data_len—— 需要填充的数据长度(字节)返回值应为
0表示成功,或其他错误码
这允许你提供自定义音频数据源,例如程序化生成音频或从网络流接收数据
重要
回调在音频线程中执行,必须快速返回以避免音频中断。不要在回调中执行阻塞操作
Callable get_pcmread_callback() const#
返回当前设置的 PCM 读取回调函数。如果未设置回调,则返回空的 Callable
void set_pcmsetpos_callback(callback: Callable)#
设置 PCM 定位回调函数。当 FMOD 需要改变声音的内部读取位置时(例如循环或跳转),会调用此回调
回调函数签名: func callback(position: int, time_unit: int) -> int
position—— 请求的新位置time_unit—— 位置的时间单位(参见FmodSystem.FmodTimeUnit)返回值应为
0表示成功,或其他错误码
这对于自定义数据源需要知道何时发生位置跳转的情况非常有用
Callable get_pcmsetpos_callback() const#
返回当前设置的 PCM 定位回调函数。如果未设置回调,则返回空的 Callable
void set_nonblock_callback(callback: Callable)#
设置非阻塞加载完成回调函数。当使用非阻塞标志( FMOD_NONBLOCKING )打开声音且加载完成时,会调用此回调
回调函数签名: func callback(sound: FmodSound, result: int) -> int
sound—— 加载完成的声音对象result—— 加载结果,0表示成功,或其他错误码返回值应为
0
这允许你在声音异步加载完成后立即收到通知,无需轮询 get_open_state()
sound.set_nonblock_callback(func(s: FmodSound, result: int) -> void:
if result == 0:
print("Sound loading complete!")
channel = system.play_sound(s, master_group, false)
)
参见
get_open_state() 用于手动轮询加载状态
Callable get_nonblock_callback() const#
返回当前设置的非阻塞加载完成回调函数。如果未设置回调,则返回空的 Callable
其它#
FmodSound load_from_file(path: String) static#
用于从文件路径加载声音的静态方法。该路径应是有效的文件系统路径或 Godot 资源路径( res:// )
var sound = FmodSound.load_from_file("res://music.mp3")
枚举#
FmodSoundType#
成员 |
值 |
说明 |
|---|---|---|
FMOD_SOUND_TYPE_UNKNOWN |
0 |
未知或不支持的音频格式 |
FMOD_SOUND_TYPE_AIFF |
1 |
音频交换文件格式(.aif,.aiff)。仅限无压缩整数格式 |
FMOD_SOUND_TYPE_ASF |
2 |
Microsoft 高级系统格式(.asf、.wma、.wmv)。平台提供解码器,仅在 Windows 上可用 |
FMOD_SOUND_TYPE_DLS |
3 |
可下载音频(.dls)。MIDI(.mid)使用的多声音库格式 |
FMOD_SOUND_TYPE_FLAC |
4 |
无损音频编解码器(.flac) |
FMOD_SOUND_TYPE_FSB |
5 |
FMOD 采样库(.fsb)。专有多声音库格式。支持编码:PCM16、FADPCM、Vorbis、AT9、XMA、Opus |
FMOD_SOUND_TYPE_IT |
6 |
Impulse Tracker 模块格式 |
FMOD_SOUND_TYPE_MIDI |
7 |
乐器数字接口 |
FMOD_SOUND_TYPE_MOD |
8 |
Protracker / Fasttracker 模块文件 |
FMOD_SOUND_TYPE_MPEG |
9 |
动态影像专家组(.mp2,.mp3)。还支持.wav(RIFF)容器格式 |
FMOD_SOUND_TYPE_OGGVORBIS |
10 |
Ogg Vorbis(.ogg) |
FMOD_SOUND_TYPE_PLAYLIST |
11 |
播放列表信息容器(.asx、.pls、.m3u、.wax)。无音频,仅有标签 |
FMOD_SOUND_TYPE_RAW |
12 |
原始未压缩PCM数据(.raw) |
FMOD_SOUND_TYPE_S3M |
13 |
ScreamTracker 3 模块(.s3m) |
FMOD_SOUND_TYPE_USER |
14 |
用户自制的声音 |
FMOD_SOUND_TYPE_WAV |
15 |
Microsoft 波形音频文件格式(.wav)。支持的编码:无压缩PCM,IMA ADPCM。平台提供仅在Windows上可用的ACM解码扩展 |
FMOD_SOUND_TYPE_XM |
16 |
FastTracker 2 扩展模块(.xm) |
FMOD_SOUND_TYPE_XMA |
17 |
Microsoft XMA 位流支持,支持FSB(.fsb)容器格式。平台提供解码器,仅在Xbox上可用 |
FMOD_SOUND_TYPE_AUDIOQUEUE |
18 |
Apple 音频队列解码器(.mp4、.m4a、.mp3)。支持的编码:AAC、ALAC、MP3。平台提供解码器,仅在 iOS/tvOS 设备上使用 |
FMOD_SOUND_TYPE_AT9 |
19 |
索尼ATRAC9位流支持FSB(.fsb)容器格式。平台提供解码器,仅在PlayStation上可用 |
FMOD_SOUND_TYPE_VORBIS |
20 |
Vorbis 比特流支持 FSB(.fsb)容器格式 |
FMOD_SOUND_TYPE_MEDIA_FOUNDATION |
21 |
Microsoft Media Foundation 解码器(.asf、.wma、.wmv、.mp4、.m4a)。平台提供的解码器,仅在 UWP 上可用 |
FMOD_SOUND_TYPE_MEDIACODEC |
22 |
Google Media 编解码器(.m4a,.mp4)。平台提供的解码器,仅在安卓上提供 |
FMOD_SOUND_TYPE_FADPCM |
23 |
FMOD 自适应差分脉冲码调制比特流,支持FSB(.fsb)容器格式 |
FMOD_SOUND_TYPE_OPUS |
24 |
Opus 比特流支持,支持 FSB(.fsb)容器格式。平台提供解码器,仅支持 Xbox Series X|S、PS5 和 Switch |
FMOD_SOUND_TYPE_MAX |
25 |
支持的最大声音类型 |
FmodSoundFormat#
成员 |
值 |
说明 |
|---|---|---|
FMOD_SOUND_FORMAT_NONE |
0 |
未知 |
FMOD_SOUND_FORMAT_PCM8 |
1 |
8位整数PCM数据 |
FMOD_SOUND_FORMAT_PCM16 |
2 |
16位整数PCM数据 |
FMOD_SOUND_FORMAT_PCM24 |
3 |
24位整数PCM数据 |
FMOD_SOUND_FORMAT_PCM32 |
4 |
32位整数PCM数据 |
FMOD_SOUND_FORMAT_PCMFLOAT |
5 |
32位浮点PCM数据 |
FMOD_SOUND_FORMAT_BITSTREAM |
6 |
声音数据为其原生压缩格式 |
FMOD_SOUND_FORMAT_MAX |
7 |
支持的最大声音格式 |
FmodTagType#
成员 |
值 |
说明 |
|---|---|---|
FMOD_TAG_TYPE_UNKNOWN |
0 |
FMOD不识别的标签类型 |
FMOD_TAG_TYPE_ID3V1 |
1 |
MP3 ID3 标签 1.0。通常 1 个标签存储在 MP3 文件末尾 128 字节处 |
FMOD_TAG_TYPE_ID3V2 |
2 |
MP3 ID3标签2.0。可变长度标签,可能超过1个 |
FMOD_TAG_TYPE_VORBISCOMMENT |
3 |
元数据容器,适用于 Vorbis、FLAC、Theora、Speex 和 Opus 文件格式 |
FMOD_TAG_TYPE_SHOUTCAST |
4 |
SHOUTcast 互联网流元数据 |
FMOD_TAG_TYPE_ICECAST |
5 |
可在播放过程中发布的Icecast互联网流元数据 |
FMOD_TAG_TYPE_ASF |
6 |
高级系统格式元数据通常与Windows Media格式(如WMA)相关 |
FMOD_TAG_TYPE_MIDI |
7 |
存储在MIDI文件中的元数据 |
FMOD_TAG_TYPE_PLAYLIST |
8 |
播放列表文件如PLS、M3U、ASX和WAX会通过该标签类型填充播放列表信息 |
FMOD_TAG_TYPE_FMOD |
9 |
FMOD 的 MIDI、MOD、S3M、XM、IT 格式支持以及网络流用于通知互联网流事件(如采样率变化)的标签类型 |
FMOD_TAG_TYPE_USER |
10 |
对于编解码器开发者来说,这种标签类型可以配合 FMOD_CODEC_METADATA_FUNC 生成自定义元数据 |
FMOD_TAG_TYPE_MAX |
11 |
支持的最大标签类型数量 |
FmodTagDataType#
成员 |
值 |
说明 |
|---|---|---|
FMOD_TAG_DATA_TYPE_BINARY |
0 |
原始二进制数据 |
FMOD_TAG_DATA_TYPE_INT |
1 |
整数 |
FMOD_TAG_DATA_TYPE_FLOAT |
2 |
浮点数 |
FMOD_TAG_DATA_TYPE_STRING |
3 |
8位ASCII字元字符串 |
FMOD_TAG_DATA_TYPE_STRING_UTF16 |
4 |
16位UTF字符串 |
FMOD_TAG_DATA_TYPE_STRING_UTF16BE |
5 |
16位UTF字符串大端序字节序 |
FMOD_TAG_DATA_TYPE_STRING_UTF8 |
6 |
8位UTF字符串 |
FMOD_TAG_DATA_TYPE_MAX |
7 |
支持的最大标签数据类型数量 |
FmodOpenState#
成员 |
值 |
说明 |
|---|---|---|
FMOD_OPEN_STATE_READY |
0 |
准备就绪 |
FMOD_OPEN_STATE_LOADING |
1 |
正在加载中 |
FMOD_OPEN_STATE_ERROR |
2 |
无法打开,通常是找不到文件、内存不足等 |
FMOD_OPEN_STATE_CONNECTING |
3 |
连接到远程主机(仅在互联网播放声音时) |
FMOD_OPEN_STATE_BUFFERING |
4 |
缓冲数据 |
FMOD_OPEN_STATE_SEEKING |
5 |
正在定位子声道并强制刷新流缓冲区 |
FMOD_OPEN_STATE_PLAYING |
6 |
已经准备好并可以播放,但目前无法释放,否则主线会停滞 |
FMOD_OPEN_STATE_SETPOSITION |
7 |
在流中寻找不同的位置 |
FMOD_OPEN_STATE_MAX |
8 |
开放状态类型的最大数量 |
FmodSoundLock#
继承自: RefCounted
提供对声音样本数据的直接访问,以进行读取或修改
描述#
FmodSoundLock 用于锁定声音数据的区域以进行直接访问。这允许读取或修改声音的原始采样数据
当声音被锁定时,FMOD 会提供一个或两个指向数据的指针(如果锁定的区域绕过了声音缓冲区的末尾,则使用两个指针)
重要
在完成数据访问后,务必调用 unlock(),或者使用 RAII 模式(让对象超出作用域)自动解锁
备注
锁定声音可能代价较大,因为它会阻塞混音线程。请尽量少用且仅用于短时间
方法#
PackedByteArray get_data1() const#
以 PackedByteArray 的形式返回锁定数据的前一部分,在大多数情况下,这包含锁定区域的大部分内容
PackedByteArray get_data2() const#
返回锁定数据的第二部分作为 PackedByteArray,只有当锁定区域绕过声音缓冲区的末端时,这部分才非空
bool is_locked() const#
如果声音数据当前被锁定并且可访问,则返回 true
void unlock()#
解锁声音数据,允许 FMOD 恢复正常处理,在访问数据完成后应立即调用此函数
备注
如果数据仍然被锁定,析构函数会自动调用此函数