Получить длину или длительность файла .wav - PullRequest
25 голосов
/ 20 октября 2011

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

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

Ответы [ 6 ]

42 голосов
/ 20 октября 2011

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

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

10 голосов
/ 12 января 2017

Очень простой способ - использовать 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

Это соответствует 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
6 голосов
/ 23 февраля 2016

мы можем использовать 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 голосов
/ 21 октября 2011
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()
1 голос
/ 13 мая 2019

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

import librosa
librosa.get_duration(filename='my.wav')
0 голосов
/ 04 мая 2018

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

import os
os.chdir(foo) # Get into the dir with sound
statbuf = os.stat('Sound.wav')
mbytes = statbuf.st_size / 1024
duration = mbytes / 200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...