You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:44