Подтвердить что ты не робот

Получить длину или продолжительность файла .wav

Я ищу способ узнать продолжительность аудиофайла (.wav) в python. До сих пор я смотрел библиотеку python wave, mutagen, pymedia, pymad Мне не удалось получить длительность wav файла. pymad дал мне продолжительность, но ее не последовало.

Спасибо заранее.

4b9b3361

Ответ 1

Продолжительность равна количеству кадров, деленное на частоту кадров (кадров в секунду):

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 секунд. Поэтому я считаю, что количество кадров не зависит от количества каналов, и приведенная выше формула верна.

Ответ 2

Очень простой способ - использовать pysoundfile, https://github.com/bastibe/PySoundFile

Вот пример кода, как это сделать:

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))

Выход для этого конкретного файла:

samples = 232569
sample rate = 16000
seconds = 14.5355625

Это совпадает с Сокси:

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

Ответ 3

мы можем использовать ffmpeg для получения длительности любых видео или аудио файлов.

Для установки ffmpeg перейдите по этой ссылке

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'])

Ответ 4

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()

Ответ 5

библиотека librosa может сделать это: librosa

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

Ответ 6

Чтобы определить длину музыкального файла, можно использовать аудиорегистральный модуль,

установить аудиозапись: pip install audioread

затем используйте этот код:

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

Ответ 7

Это короткий и не требует модулей, работает со всеми операционными системами:

import os
os.chdir(foo) # Get into the dir with sound
statbuf = os.stat('Sound.wav')
mbytes = statbuf.st_size / 1024
duration = mbytes / 200