web-dev-qa-db-ja.com

MediaPlayerで現在の音量/振幅を取得するにはどうすればよいですか?

私は、オーディオファイルを録音するアプリと、録音後にそのファイルを再生するオプションの両方に取り組んでいます。 UIには、録音の現在の振幅に関連してアニメーション化するEQコンポーネントがあります。 MediaRecorder.getMaxAmplitude()メソッドを使用してアニメーションを機能させていますが、MediaPlayerでこれを行う方法が見つかりません。この機能を実行する音楽視覚化ライブ壁紙がデフォルトであるので、それが可能である必要があることはわかっていますが、AOSPを介してコーミングするときにその情報を取得する方法を確認できません。誰かがこれを機能させる方法を知っていますか?

20
Scott Ferguson

AudioManager を使用する必要があると思います。 APIに記載されているように、ボリュームコントロールに使用できます。

AudioManagerは、音量と呼び出し音モードの制御へのアクセスを提供します。

Context.getSystemService(Context.AUDIO_SERVICE)を使用して、このクラスのインスタンスを取得します。

それから この方法 が役立つと思います。

9
anon

Audiomanagerクラスを使用して、メディアプレーヤーの現在のボリュームを取得できます。コードは次のとおりです。

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int volume_level= am.getStreamVolume(AudioManager.STREAM_MUSIC);

同様に、メディアプレーヤーのデフォルトの音量を設定する場合は、次のように設定できます。

am.setStreamVolume(
            AudioManager.STREAM_MUSIC,
            volume_level,
            0);

それがすべてです。幸せなコーディング:)

25
Deepak Sharma

あなたは幸運です。 Visualizerと呼ばれるクラスがあります。これは、私が思うように動作します。

import Android.app.Activity;
import Android.media.audiofx.Visualizer;
import Android.os.Bundle;
import Android.util.Log;


public class MainActivity extends Activity {
private Visualizer audioOutput = null;
public float intensity = 0; //intensity is a value between 0 and 1. The intensity in this case is the system output volume
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    createVisualizer();

}


private void createVisualizer(){
    int rate = Visualizer.getMaxCaptureRate();
    audioOutput = new Visualizer(0); // get output audio stream
    audioOutput.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
        @Override
        public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
            intensity = ((float) waveform[0] + 128f) / 256;
            Log.d("vis", String.valueOf(intensity));
        }

        @Override
        public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {

        }
    },rate , true, false); // waveform not freq data
    Log.d("rate", String.valueOf(Visualizer.getMaxCaptureRate()));
    audioOutput.setEnabled(true);
}


}

これらの権限が必要になります。

<uses-permission Android:name="Android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
10
Ohiovr

DataLineにgetLevel()を実装する必要があります。これは、Javaと同じくらいバスに近い場所です。

これには、サウンドストリームバッファーからの振幅(波形)データの移動平均の計算が含まれます。

これにより、多くのバストラフィックがバッファにアクセスするため、抽象メソッドとして残されます。

二乗平均平方根(RMS)は1つのアプローチです。

https://community.Oracle.com/message/53910

FFTを備えたDSP(例:Visualizerクラス)は完全な周波数スペクトルを提供しますが、より多くのCPUリソースを消費します。

必要なものがRMS(たとえば、単純なビート検出)である場合は、フルDSPで非難しないでください。サンプルの品質を制限してパフォーマンスを向上させます。

2

私は 似たようなもの を行う方法をしばらく探していました。メディアストリームで再生されているすべてのボリューム/振幅を確認できるようにしたいのですが、現在再生しているものに対してそれを実行できることで解決します。

これまでのところ、私が見つけた最良のソリューションは RingDroid に実装されています。私はコードを詳しく調べていませんが、RingDroidがサウンドマップを作成する方法は、実際にサウンドファイルを少しずつ分析することによるようです。

私は同様のアプローチを使用して、オーディオファイルとは別に実行されるが同期したペースで実行されるビジュアライザーを表示することを検討しました。しかし、これはもっと簡単なはずの何かに対してはあまりにも多くの作業のようです。

1
HenryAdamsJr

私はこの解決策を得ました:

final int volume_level = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = (float) volume_level / maxVolume;
0
Vivek Thummar

次のように:

audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
int volumeLevel = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolumeLevel = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int volumePercent = (int) (((float) volumeLevel / maxVolumeLevel) * 100);
0
Hadi Note