问题
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 wavedef 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))
执行后的结果: