アンドロイドメディアプレーヤーを使用してオーディオを再生しているときにビジュアライザーが波を表示することを知っています。
しかし、オーディオの録音中にビジュアライザーを表示したいのですが、録音中にユーザーの声のビートに基づいて変化する線形波を表示したいのです。
アンドロイドで行うことは可能ですか?
アンドロイドメディアプレーヤーを使用してオーディオを再生しているときにビジュアライザーが波を表示することを知っています。
しかし、オーディオの録音中にビジュアライザーを表示したいのですが、録音中にユーザーの声のビートに基づいて変化する線形波を表示したいのです。
アンドロイドで行うことは可能ですか?
xミリ秒ごとにMediaRecorder.getMaxAmplitude()を呼び出すことにより、(公式ドキュメントから)次のようになります。
このメソッドの最後の呼び出し以降にサンプリングされた最大絶対振幅。
次に、この値をリアルタイムで処理して、グラフを描画したり、一部のビュープロパティを変更したりできます。
完璧ではありませんが、お役に立てば幸いです=)
編集:ご存知のとおり、取得される値はすべてのAndroidデバイスで同じになります:0〜32767(マイクを吹き込んだときにこの値を示す10kを超えるユーザーのレポートがあります)。
MediaRecorderの代わりにAudioRecorderクラスを使用する必要がある場合があります。
オーディオデータをファイルに直接配置するのではなく、byte []に配置するAudioRecorder#read(...)メソッドを確認してください。
グラフに変更を表示するには、データ(PCM 8または16ビットでエンコードされている-リンク)を分析し、グラフをリアルタイムで更新する必要があります。
2つの重要なこと:
リアルタイムグラフを使用するため、これらのポイントをプロットするには、SurfaceViewを使用します。
録音バイトを数値に変換する参照: Android:変数「temp」がオーディオの数値を保持していることがわかる場所でサウンドが発生した場合にサウンドを録音するリスナー。
プロットポイント Y値を示すこれらの数値は、増加するX(時間間隔)値(0,1,2 ..)に対してグラフとしてプロットされます。SurfaceViewの使用例:
//canvas.drawLine(previous X value,previous Y value,X,Y, paint); canvas.drawPoint(X,Y,paint); SurfaceHolder.unlockCanvasAndPost(canvas);
すべての値をプロットする必要はありません。効率を上げるために、これらの値を条件でフィルタリングし、特定の時間間隔でプロットすることができます。
お役に立てれば :)