La duración es igual al número de tramas dividido por la tasa de fotogramas (cuadros por segundo):
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)
respecto al comentario @edwards', aquí está algo de código para producir una onda de 2 canales file:
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()
Si reproduce el archivo resultante en un reproductor de audio, verá que tiene una duración de 40 segundos. Si ejecuta el código anterior, también calcula que la duración es de 40 segundos. Por lo tanto, creo que el número de fotogramas no está influenciado por la cantidad de canales y que la fórmula anterior es correcta.
tuve un vistazo a todo el 'wave' función de biblioteca pero se pasa por alto lógica simple' nframes/frame_rate'. Gracias por el método y el código :) – Pannu
Esto no es del todo correcto ... hay un fotograma escrito para cada canal, y por lo tanto 'duración = frames/float (rate * f.getnchannels())' – edward
@edward : He agregado un código arriba que crea un archivo de onda de 2 canales. La fórmula publicada en mi respuesta calcula la duración en 40 segundos, lo que concuerda con lo que veo cuando reproduzco el archivo .wav. Por lo tanto, me parece que el número de fotogramas no se duplica cuando usa 2 canales y mi fórmula original es correcta. – unutbu