it-swarm-id.com

Dapatkan panjang atau durasi file .wav

Saya sedang mencari cara untuk mengetahui durasi file audio (.wav) dalam python. Sejauh ini saya telah melihat perpustakaan python wave, mutagen, pymedia, pymad saya tidak bisa mendapatkan durasi dari file wav. Pymad memberi saya durasi tetapi tidak konsisten. 

Terima kasih sebelumnya. 

24
Pannu

Durasi sama dengan jumlah frame dibagi dengan framerate (frame per detik):

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)

Mengenai komentar @edwards ', berikut adalah beberapa kode untuk menghasilkan file gelombang 2-channel:

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

Jika Anda memutar file yang dihasilkan dalam pemutar audio, Anda akan menemukan bahwa durasi adalah 40 detik. Jika Anda menjalankan kode di atas, ia juga menghitung durasinya menjadi 40 detik. Jadi saya percaya jumlah frame tidak dipengaruhi oleh jumlah saluran dan rumus di atas benar. 

40
unutbu

Metode yang sangat sederhana adalah dengan menggunakan pysoundfile, https://github.com/bastibe/PySoundFile

Berikut ini beberapa contoh kode cara melakukan ini:

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

Output untuk file tertentu adalah:

samples = 232569
sample rate = 16000
seconds = 14.5355625

Ini sejajar dengan 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
Dave C

kita bisa menggunakan ffmpeg untuk mendapatkan durasi file video atau audio.

Untuk menginstal ffmpeg ikuti tautan ini

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

Ini singkat dan tidak memerlukan modul, bekerja dengan semua sistem operasi:

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