私は、オーディオ ファイルを録音し、録音後にそのファイルを再生するオプションを備えたアプリに取り組んでいます。UI には、録音の現在の振幅に関連してアニメーション化する EQ コンポーネントがあります。メソッドを介してアニメーションを動作させましMediaRecorder.getMaxAmplitude()
たが、MediaPlayer でこれを行う手段が見つかりません。デフォルトでこの機能を実行する音楽ビジュアライゼーションのライブ壁紙があるため、可能に違いないことはわかっていますが、AOSP をくまなく調べたときにその情報を引き出す方法がわかりません。これを機能させる方法を知っている人はいますか?
7 に答える
Audiomanager クラスの助けを借りて、メディア プレーヤーの現在の音量を取得できます。コードは次のとおりです。
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int volume_level= am.getStreamVolume(AudioManager.STREAM_MUSIC);
同様に、メディア プレーヤーのデフォルトの音量を設定する場合は、次のようにします。
am.setStreamVolume(
AudioManager.STREAM_MUSIC,
volume_level,
0);
それだけです.ハッピーコーディング:)
AudioManagerを使用する必要があると思います。API が述べているように、ボリューム コントロールに使用できます。
AudioManager は、ボリュームとリンガー モード コントロールへのアクセスを提供します。
Context.getSystemService(Context.AUDIO_SERVICE) を使用して、このクラスのインスタンスを取得します。
それなら、この方法は有効だと思います。
DataLine に getLevel() を実装する必要があります。これは、Java で得られるのと同じくらいバスに近いものです。
これには、サウンド ストリーム バッファからの振幅 (波形) データの移動平均の計算が含まれます。
これにより、大量のバス トラフィックがバッファにアクセスするため、抽象メソッドとして残されます。
二乗平均平方根 (RMS) は 1 つのアプローチです。
https://community.oracle.com/message/5391003
FFT を使用する DSP (例: Visualizer クラス) は、完全な周波数スペクトルを提供しますが、より多くの CPU リソースを消費します。
RMS だけが必要な場合 (単純なビート検出など)、DSP をフルに使用しないでください。サンプルの品質を制限して、パフォーマンスを向上させます。
私はしばらくの間、似たようなことをする方法を探していました。メディア ストリームで再生されているあらゆるもののボリューム/振幅を確認できるようにしたいのですが、現在再生しているコンテンツについてはそれができるようにすることにします。
これまでのところ、私が見つけた最良の解決策はRingDroidに実装されています。コードはあまり詳しく調べていませんが、RingDroid がサウンドマップを作成する方法は、実際にサウンド ファイルを少しずつ分析することによるようです。
同様のアプローチを使用して、オーディオ ファイルとは別に実行されるビジュアライザーを表示することを検討しましたが、同期されたペースで実行されます。ただし、これは、より単純にする必要があるものに対して、あまりにも多くの作業のように思えます。