2014-08-29

指定したディレクトリ下にあるwavファイルの合計時間(python)

wavファイルの合計時間が欲しかったのだけどsoxとかではあんまりうまく出来ないみたいなので自分で書いてみた。バイナリファイルの処理なので、なんとなくPython。

import sys
import os
import struct
import fractions

if len(sys.argv) != 2:
    print "Usage: python %s <directory>" % sys.argv[0]
    quit()

dir = sys.argv[1]
files = [y for y in [os.path.join(dir, x) for x in os.listdir(dir)] if os.path.isfile(y) and os.path.splitext(y)[1].upper()==".WAV"]

totalSeconds = fractions.Fraction()
for file in files:
    print file
    f = open(file, 'rb')
    riff = f.read(4)
    if riff == "RIFF":
        riffSize, riffType = struct.unpack('<I4s', f.read(8))

        samplesPerSec = 0
        blockSize = 0
        while True:
            chunkType,chunkSize = struct.unpack('<4sI', f.read(8))

            if chunkType == "fmt ":
                formatId,channels,samplesPerSec,bytesPerSec,blockSize,bitsPerSample = struct.unpack('<HHIIHH', f.read(chunkSize))
            elif chunkType == "data":
                totalSeconds += fractions.Fraction(chunkSize / blockSize, samplesPerSec)
                break
            else:
                f.seek(chunkSize, os.SEEK_CUR)

    f.close()

print "totalSeconds " + str(float(totalSeconds))
print "totalMinutes " + str(float(totalSeconds / 60))

なんて書いてみたら、後からwaveライブラリなんてものがあることに気がついたorz。

import wave
w = wave.open("a.wav")
w.getframerate()
w.getnframes()

みたいな感じでサンプリングレートとサンプル数が取得できるんだって。