Get .wav file length or duration

后端 未结 9 726
暗喜
暗喜 2020-12-04 10:17

I\'m looking for a way to find out the duration of a audio file (.wav) in python. So far i had a look at python wave library, mutagen, pymedi

相关标签:
9条回答
  • 2020-12-04 10:38
    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()
    
    0 讨论(0)
  • 2020-12-04 10:39

    Let,T be the duration between 2 consecutive samples. So, we can write t = nT or t = n/Fs.

    from scipy.io import wavfile
    Fs, data = wavfile.read('filename.wav')
    n = data.size
    t = n / Fs
    
    0 讨论(0)
  • 2020-12-04 10:39

    I was trying to get the length of different format of an audio file other than '.wav' and I tried a few of the above solution but didn't work for me

    This is what worked for me :

    from pydub.utils import mediainfo
    mediainfo('audiofile')['duration']
    
    0 讨论(0)
  • 2020-12-04 10:45

    To find length of music file, audioread module can be used,

    install audioread: pip install audioread

    then use this code:

    import audioread
    with audioread.audio_open(filepath) as f:
        totalsec = f.duration
        min,sec = divmod(totalsec,60) # divides total time in minute  and second 
                                        #and store it in min and sec variable respectively
    
    0 讨论(0)
  • 2020-12-04 10:46

    the librosa library can do this: librosa

    import librosa
    librosa.get_duration(filename='my.wav')
    
    0 讨论(0)
  • 2020-12-04 10:50

    The duration is equal to the number of frames divided by the framerate (frames per second):

    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)
    

    Regarding @edwards' comment, here is some code to produce a 2-channel wave 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()
    

    If you play the resultant file in an audio player, you'll find that is 40 seconds in duration. If you run the code above it also computes the duration to be 40 seconds. So I believe the number of frames is not influenced by the number of channels and the formula above is correct.

    0 讨论(0)
提交回复
热议问题