问题
windows播放WAV音频文件,一般使用API函数,如PlaySound。实际使用发现,从调用PlaySound到实际开始播放存在200ms以上的延时,在游戏编程中音效实时性是个需要解决的问题。
本文主要讨论,windows播放WAV文件的衍生问题:如何测量WAV文件的播放时长?
解决方法
1、WAV文件头部格式
WAV(Waveform Audio File Format)是一种常见的音频文件格式,它以无损的方式存储音频数据。每个WAV文件都包含一个文件头(Header)来描述音频的格式和属性。下面是WAV文件头的一般格式:
typedef struct {
    char     riff[4];        // "RIFF"标识符
    DWORD    fileSize;       // 文件总大小(不包括riff和fileSize字段本身的大小)
    char     wave[4];        // "WAVE"标识符
    char     fmt[4];         // "fmt "标识符
    DWORD    fmtSize;        // fmt块大小
    WORD     audioFormat;    // 音频格式代码(例如,PCM为1)
    WORD     numChannels;    // 声道数
    DWORD    sampleRate;     // 采样率
    DWORD    byteRate;       // 每秒的字节数
    WORD     blockAlign;     // 数据块对齐单位(每个采样帧的字节数)
    WORD     bitsPerSample;  // 每个采样的位数
    char     data[4];        // "data"标识符
    DWORD    dataSize;       // 音频数据大小
} WAVHeader;WAV文件头的结构包括以下字段:
- riff: 固定为"RIFF",表示文件类型。
- fileSize: 文件的总大小,不包括- riff和- fileSize字段本身的大小。
- wave: 固定为"WAVE",表示音频格式类型。
- fmt: 固定为"fmt ",表示音频格式块。
- fmtSize: fmt块的大小。
- audioFormat: 音频格式代码,常见的PCM格式为1。
- numChannels: 声道数,如单声道为1,立体声为2。
- sampleRate: 采样率,表示每秒采样的次数。
- byteRate: 每秒的字节数,计算方式为- sampleRate * numChannels * bitsPerSample / 8。
- blockAlign: 数据块对齐单位,表示每个采样帧的字节数,计算方式为- numChannels * bitsPerSample / 8。
- bitsPerSample: 每个采样的位数,表示音频的精度。
- data: 固定为"data",表示音频数据块。
- dataSize: 音频数据的大小,即音频数据块的字节数。
2、使用Python计算WAV文件播放时长
import wave
def get_wav_duration(file_path):
    with wave.open(file_path, 'rb') as wav_file:
        # 获取音频文件的帧数
        frames = wav_file.getnframes()
        # 获取帧速率(每秒的帧数)
        frame_rate = wav_file.getframerate()
        # 计算音频时长(单位:秒)
        duration = frames / float(frame_rate)
        return duration
# 指定 WAV 文件的路径
file_path = 'D:/01.Study/PYTHON/01/1.wav'
# 调用函数获取时长
duration = get_wav_duration(file_path)
print("文件时长:{} 秒".format(duration))执行后的结果:



















