python - play - Obtener longitud de archivo.wav o duración
reproducir un archivo de audio en python (4)
La duración es igual al número de fotogramas divididos por la tasa de fotogramas (fotogramas 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)
Con respecto al comentario de @edwards, aquí hay un código para producir un archivo de onda de 2 canales:
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.
Estoy buscando una forma de averiguar la duración de un archivo de audio (.wav) en python. Hasta ahora pymedia
pymad
un vistazo a wave
biblioteca de wave
python, pymedia
, pymad
, pymedia
, y no he podido obtener la duración del archivo wav. Pymad
me dio la duración pero no es consistente.
Gracias por adelantado.
Un método muy simple es usar pysoundfile, https://github.com/bastibe/PySoundFile
Aquí hay un código de ejemplo de cómo hacer esto:
import soundfile as sf
f = sf.SoundFile(''447c040d.wav'')
print(''samples = {}''.format(len(f)))
print(''sample rate = {}''.format(f.samplerate))
print(''seconds = {}''.format(len(f) / f.samplerate))
La salida para ese archivo en particular es:
samples = 232569
sample rate = 16000
seconds = 14.5355625
Esto se alinea con soxi:
Input File : ''447c040d.wav''
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:14.54 = 232569 samples ~ 1090.17 CDDA sectors
File Size : 465k
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM
podemos usar ffmpeg para obtener la duración de cualquier video o archivo de audio.
Para instalar ffmpeg siga este enlace
import subprocess
import re
process = subprocess.Popen([''ffmpeg'', ''-i'', path_of_wav_file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = process.communicate()
matches = re.search(r"Duration:/s{1}(?P<hours>/d+?):(?P<minutes>/d+?):(?P<seconds>/d+/./d+?),", stdout, re.DOTALL).groupdict()
print matches[''hours'']
print matches[''minutes'']
print matches[''seconds'']
import os
path="c://windows//system32//loopymusic.wav"
f=open(path,"r")
#read the ByteRate field from file (see the Microsoft RIFF WAVE file format)
#https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
#ByteRate is located at the first 28th byte
f.seek(28)
a=f.read(4)
#convert string a into integer/longint value
#a is little endian, so proper conversion is required
byteRate=0
for i in range(4):
byteRate=byteRate + ord(a[i])*pow(256,i)
#get the file size in bytes
fileSize=os.path.getsize(path)
#the duration of the data, in milliseconds, is given by
ms=((fileSize-44)*1000)/byteRate
print "File duration in miliseconds : " % ms
print "File duration in H,M,S,mS : " % ms/(3600*1000) % "," % ms/(60*1000) % "," % ms/1000 % "," ms%1000
print "Actual sound data (in bytes) : " % fileSize-44
f.close()