it-swarm.com.de

Abrufen der Länge oder Dauer der WAV-Datei

Ich suche nach einer Möglichkeit, die Dauer einer Audiodatei (.wav) in Python herauszufinden. Bisher habe ich mir Python wave library, mutagen, pymedia, pymad angesehen. Pymad gab mir die Dauer, aber sie ist nicht konsistent. 

Danke im Voraus. 

24
Pannu

Die Dauer entspricht der Anzahl der Frames geteilt durch die Framerate (Frames pro Sekunde):

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)

In Bezug auf den Kommentar von @edwards finden Sie hier etwas Code zum Erzeugen einer 2-Kanal-Wave-Datei:

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

Wenn Sie die resultierende Datei in einem Audioplayer abspielen, werden Sie feststellen, dass sie 40 Sekunden dauert. Wenn Sie den obigen Code ausführen, wird auch die Dauer mit 40 Sekunden berechnet. Ich glaube also, dass die Anzahl der Frames nicht von der Anzahl der Kanäle beeinflusst wird und obige Formel korrekt ist. 

40
unutbu

Eine sehr einfache Methode ist die Verwendung von pysoundfile, https://github.com/bastibe/PySoundFile

Hier ist ein Beispielcode, wie das geht:

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

Die Ausgabe für diese bestimmte Datei lautet:

samples = 232569
sample rate = 16000
seconds = 14.5355625

Dies stimmt mit soxi überein:

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
Dave C

wir können ffmpeg verwenden, um die Dauer von Video- oder Audiodateien abzurufen.

Um ffmpeg zu installieren, folgen Sie diesem link

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']
6
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()
4
deAngel

die Librosa-Bibliothek kann dies tun: Librosa

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

Dies ist kurz und benötigt keine Module und funktioniert mit allen Betriebssystemen:

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