Как получить продолжительность файла .WAV, который не поддерживается модулем волны в python?

Я пишу программу для комментирования файлов .wav, поэтому мне нужно их воспроизвести и узнать их продолжительность. Я могу использовать модуль winsound для воспроизведения (используя SND_ASYNC), но я не могу использовать модуль wave для чтения файла, потому что сжатие файлов, которые я использую, не поддерживается.

Должен ли я использовать другой модуль для получения продолжительности файлов .WAV, или я должен использовать один модуль для воспроизведения и получения информации о файлах? Какие модули следует использовать?


person Lewistrick    schedule 25.06.2013    source источник
comment
как насчет того, чтобы сначала распаковать и сделать его поддерживаемым Python?   -  person Raptor    schedule 25.06.2013
comment
Я не знаю, как это сделать. Мы говорим о 5000 файлов здесь.   -  person Lewistrick    schedule 25.06.2013
comment
это работает?   -  person Aya    schedule 25.06.2013
comment
Это выглядит многообещающе. Но я получаю UnicodeDecodeError в a=f.read(4) при попытке сделать это (также при выполнении этого для поддерживаемых файлов). Должен ли я читать f по-другому?   -  person Lewistrick    schedule 25.06.2013
comment
@Lewistrick Вам, вероятно, нужно открыть файл в двоичном режиме. Измените строку 3 на f=open(path,"rb").   -  person Aya    schedule 25.06.2013
comment
Спасибо, я знал, что должно быть что-то в этом роде ;) Работает!   -  person Lewistrick    schedule 25.06.2013


Ответы (2)


Глядя на комментарии, это работает (я сделал несколько изменений для удобства чтения). Спасибо @Aya!

import os
path="c:\\windows\\system32\\loopymusic.wav"
f=open(path,"rb")

# 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 += 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()
person Lewistrick    schedule 25.06.2013

Использование SciPy:

 from scipy.io import wavfile
 Fs, x = wavfile.read("file.wav")
 print('Duration: ', len(x)/Fs)
person vijay    schedule 04.01.2019