71 votes

Obtenir la longueur ou la durée du fichier .wav

Je cherche un moyen de connaître la durée d'un fichier audio (.wav) en python. Jusqu'à présent, j'ai jeté un œil à la bibliothèque wave mutagen , pymedia , pymad je n'ai pas pu obtenir la durée du fichier wav. Pymad m'a donné la durée mais ce n'est pas cohérent.

Merci d'avance.

57voto

Max Points 349

la bibliothèque librosa peut le faire : librosa

 import librosa
librosa.get_duration(filename='my.wav')

37voto

Dave C Points 121

Une méthode très simple consiste à utiliser soundfile (anciennement pysoundfile ).

Voici un exemple de code expliquant comment procéder :

 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 sortie de ce fichier particulier est :

 samples = 232569
sample rate = 16000
seconds = 14.5355625

Cela s'aligne avec 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

14voto

nous pouvons utiliser ffmpeg pour obtenir la durée de tout fichier vidéo ou audio.

Pour installer ffmpeg, suivez ce lien

 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.decode(), re.DOTALL).groupdict()
 
print(matches['hours'])
print(matches['minutes'])
print(matches['seconds'])

7voto

deAngel Points 88
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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X