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