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