Python3でwavファイルから24fpsの波形データをとる
Python3でwavファイルから24fpsの波形データをとる
音の波形データを動画(24fps)に合わせて取りたかったのでやってみる。
wavファイルの読み込み
Pythonには標準ライブラリでwavファイルを扱うwavというものが用意されている。
wave.open(file, mode=None) file が文字列ならその名前のファイルを開き、そうでないなら file like オブジェクトとして扱います。 mode は以下のうちのいずれかです:
'rb'
読み出しのみのモード。
'wb'
書き込みのみのモード。
Wave_read.getnframes()
オーディオフレーム数を返します。
Wave_read.readframes(n)
最大 n 個のオーディオフレームを読み込んで、 bytes オブジェクトとして返します。
bytes(バイナリデータ)でしか取れないのでnumpy等で変換する。
import wave import numpy wf = wave.open([filename], "r") buf = wf.readframes(wf.getnframes()) data = np.frombuffer(buf, dtype = "int16")
24fpsでデータを取る
大体の音声は44100Hzで動画に使うには使いづらいので24fpsにしたい。
Wave_read.getframerate()
サンプリングレートを返します。
サンプリングレートを24で割った値ごとにデータを取っていけば24fpsにできる。 しかし、バイナリから変換した配列の長さは総オーディオフレームの2倍ある(右と左の分)ので、その2倍ごとに値を取る必要がある。
import wave import numpy wf = wave.open([filename], "r") buf = wf.readframes(wf.getnframes()) data = np.frombuffer(buf, dtype = "int16") frame = wf.getnframe()#総フレーム rate = wf.getframerate()#サンプリングレート vframe = int(rate / 24)#1837.5 vdata = [] for i in range(int(frame / vframe)): vdata.append(data[i * vframe * 2]) print(vdata) """ [289, 6628, 3149, -3613, 4529, -932, -2145, ...省略... """