文章目录
- ✅ `SDL_AudioSpec` 结构体定义
- 📌 每个字段详细解释 + 设置依据
- 1. `freq`:采样频率(Sample Rate)
- 2. `format`:采样格式(Sample Format)
- 3. `channels`:通道数(Channels)
- 4. `silence`:静音填充值
- 5. `samples`:缓冲区采样数
- 6. `size`:缓冲区总字节数(仅 SDL 填充)
- 7. `callback`:音频回调函数
- 8. `userdata`:用户数据指针
- 🎯 设置这些参数的依据
- ✅ 总结推荐设置(CD 质量 PCM 文件):
在 SDL(Simple DirectMedia Layer)中,SDL_AudioSpec
是一个用于配置和描述音频设备的结构体。它既可以用来设置音频设备,也可以用来查询设备参数(例如实际打开的音频参数)。下面是对该结构体中参数的详细讲解,并说明每个参数如何设置、依据是什么。
✅ SDL_AudioSpec
结构体定义
typedef struct SDL_AudioSpec {
int freq; // 采样频率(Hz)
SDL_AudioFormat format; // 采样点格式
Uint8 channels; // 通道数
Uint8 silence; // 静音值(用于填充缓冲)
Uint16 samples; // 每次回调请求的采样数(缓冲区大小)
Uint16 padding; // 已弃用
Uint32 size; // 缓冲区字节大小(自动计算)
SDL_AudioCallback callback;// 回调函数
void *userdata; // 用户自定义数据(传入回调)
} SDL_AudioSpec;
📌 每个字段详细解释 + 设置依据
1. freq
:采样频率(Sample Rate)
- 类型:
int
- 功能:表示每秒采样的次数,单位是 Hz。常见值为
44100
(CD)、48000
(DVD)、22050
(低质量语音)。 - 如何设置:
- 取决于音频文件或数据的格式,比如
.wav
或.pcm
文件说明。 - 可使用
ffmpeg
或sox
查看文件信息:ffprobe xxx.wav
- 取决于音频文件或数据的格式,比如
- 示例:
spec.freq = 44100;
2. format
:采样格式(Sample Format)
-
类型:
SDL_AudioFormat
(其实是Uint16
类型的宏) -
常见值:
宏名 含义 单位大小 AUDIO_U8
无符号8位 1字节 AUDIO_S16LSB
小端有符号16位 2字节 AUDIO_S16MSB
大端有符号16位 2字节 AUDIO_S16SYS
系统字节序的有符号16位 2字节 AUDIO_F32SYS
系统字节序的32位浮点 4字节 -
如何设置:
- 参考音频文件的采样格式,比如 PCM 文件常用
AUDIO_S16SYS
。 - 用
ffmpeg
命令提取 PCM 数据时指定格式:
表示是 16bit signed little endian,设为ffmpeg -i input.mp3 -f s16le -ar 44100 -ac 2 output.pcm
AUDIO_S16SYS
。
- 参考音频文件的采样格式,比如 PCM 文件常用
-
示例:
spec.format = AUDIO_S16SYS;
3. channels
:通道数(Channels)
-
类型:
Uint8
-
功能:音频通道数。1 = 单声道,2 = 立体声,5.1 声道是 6。
-
如何设置:
- 根据音频数据格式设置。
ffprobe
可查看:ffprobe audio.wav
- 对 PCM 数据,如果是
-ac 2
提取出来的,设为 2。
-
示例:
spec.channels = 2; // 立体声
4. silence
:静音填充值
-
类型:
Uint8
-
功能:无数据时 SDL 填充音频缓冲区使用的值。
-
如何设置:
- 通常设置为 0。
- 对于
AUDIO_U8
格式,静音值应该是 128(中值),而不是 0。 - 对于
AUDIO_S16SYS
等 signed 类型,静音值为 0 是合理的。
-
示例:
spec.silence = 0; // 对于 AUDIO_S16SYS
5. samples
:缓冲区采样数
-
类型:
Uint16
-
功能:SDL 音频设备每次回调时,请求的采样点数量(每通道)。
-
影响:决定音频播放延迟与频繁程度(越小越频繁,但延迟小)。
-
如何设置:
- 一般设为 512、1024、2048。音频越低延迟,需要设置越小。
- SDL 会尝试匹配接近的值。
-
示例:
spec.samples = 1024;
6. size
:缓冲区总字节数(仅 SDL 填充)
- 类型:
Uint32
- 功能:由 SDL 填充的字段,表示一次回调需要填充的总字节数。
- 说明:
- =
samples × channels × bytes_per_sample
- 无需设置,设置完 format/freq/channels/samples 后由 SDL 自动计算。
- =
7. callback
:音频回调函数
-
类型:
SDL_AudioCallback
void (* SDL_AudioCallback) (void *userdata, Uint8 *stream, int len)
-
功能:SDL 在需要音频数据时自动调用该函数。你需要往
stream
缓冲区填充len
字节的音频数据。 -
如何设置:
- 自定义函数,处理你的 PCM 数据或实时合成。
-
示例:
spec.callback = fill_audio_pcm;
8. userdata
:用户数据指针
- 类型:
void*
- 功能:传递给回调函数的用户自定义数据,可以传缓冲区、状态信息等。
- 如何设置:
- 若不需要则设置为
NULL
。 - 否则传一个结构体指针等,在回调中使用。
- 若不需要则设置为
🎯 设置这些参数的依据
- 音频文件格式:最常见的依据。用
ffmpeg
,sox
,ffprobe
等工具分析。 - 目标平台的支持能力:有些移动设备不支持浮点或高采样率格式,需调整。
- 应用需求:
- 对实时性要求高(游戏、通话) →
samples
设置小。 - 对音质要求高 → 使用高采样率、高位宽。
- 对兼容性要求高 → 使用
AUDIO_S16SYS
、44100Hz、立体声。
- 对实时性要求高(游戏、通话) →
✅ 总结推荐设置(CD 质量 PCM 文件):
spec.freq = 44100;
spec.format = AUDIO_S16SYS;
spec.channels = 2;
spec.silence = 0;
spec.samples = 1024;
spec.callback = my_audio_callback;
spec.userdata = NULL;