Длительность равна числу кадров, деленному на частоту кадров (кадров в секунду):
import wave
import contextlib
fname = '/tmp/test.wav'
with contextlib.closing(wave.open(fname,'r')) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
print(duration)
Что касается комментария @edwards, вот некоторый код для создания 2-канальногоВолновой файл:
import math
import wave
import struct
FILENAME = "/tmp/test.wav"
freq = 440.0
data_size = 40000
frate = 1000.0
amp = 64000.0
nchannels = 2
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
data = [(math.sin(2 * math.pi * freq * (x / frate)),
math.cos(2 * math.pi * freq * (x / frate))) for x in range(data_size)]
try:
wav_file = wave.open(FILENAME, 'w')
wav_file.setparams(
(nchannels, sampwidth, framerate, nframes, comptype, compname))
for values in data:
for v in values:
wav_file.writeframes(struct.pack('h', int(v * amp / 2)))
finally:
wav_file.close()
Если вы воспроизводите результирующий файл в аудиоплеере, вы обнаружите, что продолжительность составляет 40 секунд.Если вы запустите приведенный выше код, он также вычислит продолжительность до 40 секунд.Поэтому я считаю, что количество кадров не зависит от количества каналов, и приведенная выше формула верна.