能否仅用SDL库获取已加载WAV音频文件的时长(秒数)?
使用SDL 2获取WAV音频文件时长(无需第三方工具)
可以仅通过SDL库计算WAV文件的时长,不需要依赖第三方工具,核心是利用SDL_LoadWAV返回的音频参数和总字节数推导得出。
前提条件
确保调用SDL_LoadWAV时,SDL_AudioSpec结构体的字段能被正确填充——你已经发现之前字段为0是因为误用16位int类型,修正为SDL定义的标准类型后,freq(采样率)、format(音频格式)、channels(声道数)这些关键字段都会正常返回有效值。
计算逻辑
WAV时长的计算公式为:
时长(秒) = 总音频字节数(audio_len) / (采样率(freq) × 声道数(channels) × 单采样字节数)
其中单采样字节数可以通过SDL提供的SDL_AUDIO_BITSIZE宏从format字段解析得到:
- 用
SDL_AUDIO_BITSIZE(spec.format)获取每个采样的位数(比如16位、8位) - 将位数除以8,得到单采样的字节数(16位对应2字节,8位对应1字节)
代码示例
#include <SDL2/SDL.h> #include <stdio.h> int main() { if (SDL_Init(SDL_INIT_AUDIO) != 0) { fprintf(stderr, "SDL初始化失败: %s\n", SDL_GetError()); return 1; } const char* wav_path = "C:\\Windows\\Media\\ding.wav"; SDL_AudioSpec spec; Uint8* audio_buf = NULL; Uint32 audio_len = 0; // 加载WAV文件 if (!SDL_LoadWAV(wav_path, &spec, &audio_buf, &audio_len)) { fprintf(stderr, "加载WAV失败: %s\n", SDL_GetError()); SDL_Quit(); return 1; } // 计算单采样字节数 int bits_per_sample = SDL_AUDIO_BITSIZE(spec.format); int bytes_per_sample = bits_per_sample / 8; // 计算每秒音频占用的字节数 Uint32 bytes_per_sec = spec.freq * spec.channels * bytes_per_sample; // 计算总时长(保留两位小数) double duration = (double)audio_len / bytes_per_sec; printf("WAV文件时长: %.2f 秒\n", duration); // 释放资源 SDL_FreeWAV(audio_buf); SDL_Quit(); return 0; }
关键说明
- SDL没有直接提供获取WAV时长的API,但通过音频参数的数学推导可以精准计算时长
- 必须保证
SDL_AudioSpec的字段被正确填充,否则计算会出错 - 该方法仅适用于WAV格式,因为
SDL_LoadWAV仅处理WAV文件
内容的提问来源于stack exchange,提问作者user17471643
相关产品推荐
相关产品推荐

