Visualizerクラスを使用して、Android にオーディオ スペクトラム アナライザを実装しようとしています。
onFftDataCapture()
イベントのメソッドでFFT データを取得しておりOnDataCaptureListener()
、それを を使用してキャンバスに描画していますdrawLines()
。
しかし、スペクトル表示が正しく表示されません。グラフの左側のみに変化が見られます。しかし、Window Media Player では、同じ曲の出力が異なります。私は何が欠けていますか?
例やリンクを使ってこれを手伝ってくれる人はいますか?
コード
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {}
public void onFftDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {
mVisualizerView.updateVisualizer(bytes, samplingRate);
}
}, Visualizer.getMaxCaptureRate() / 2, false, true);
onPaint()
for (int i = 0; i < mBytes.length / 2; i++) {
mPoints[i * 4] = i * 8;
mPoints[i * 4 + 1] = 0;
mPoints[i * 4 + 2] = i * 8;
byte rfk = mBytes[2 * i];
byte ifk = mBytes[2 * i + 1];
magnitude = (float) (rfk * rfk + ifk * ifk);
int dbValue = (int) (10 * Math.log10(magnitude));
mPoints[i * 4 + 3] = (float) (dbValue * 7);
}
canvas.drawLines(mPoints, mForePaint);
はVisualizermVisualizer
クラスのオブジェクトで、はイベントmBytes
から取得した FFT データです。onFftDataCapture
イベントによって返される FFT データの詳細については、こちらを参照してください。
これは私が得る値ですonFftDataCapture()
:
[90, -1, -27, 102, 13, -18, 40, 33, -7, 16, -23, -23, -2, -8, -11, -9, -8, -33, -29, 44, 4, -9, -15, -1, -2, -17, -7, 1, 1, 0, 3, -11, -5, 10, -24, -6, -23, 1, -9, -21, -2, 4, 9, -10, -14, -5, -16, 8, 6, -16, 14, 3, 7, 15, 10, -2, -15, -14, -5, 10, 8, 23, -1, -16, -2, -6, 4, 9, -1, 0, 0, 9, 1, 4, -2, 6, -6, -6, 8, -4, 6, 6, -4, -5, -5, -2, 3, 0, -1, 0, -7, 0, 2, 1, 0, 1, -1, 0, -1, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1]
どんなアイデアでも、リンクは役に立ちます。
@クリス・ストラットンのアップデート
今、私は1000 Hz のファイルで方形波を再生していて、そのスクリーン ショットを撮りました。あなたは今何を提案しますか?
@ruhaldeの提案後に更新
現在、周波数スイープ (20 ~ 20000 Hz)ファイルを再生しています。このファイルは次の出力で生成されます。