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()
みたいな感じでサンプリングレートとサンプル数が取得できるんだって。