如何获取MediaPlayer中的当前音量/幅度?

时间:2010-05-27 20:33:38

标签: android android-mediaplayer

我正在制作一个既可以录制音频文件的应用程序,也可以选择在录制完文件后播放该文件。 UI具有EQ分量,该EQ分量相对于记录的当前幅度动画化。我已经通过MediaRecorder.getMaxAmplitude()方法运行了动画,但找不到任何方法来使用MediaPlayer。我知道它必须是可能的,因为默认情况下有音乐可视化动态壁纸执行此功能,但我无法看到它在通过AOSP梳理时提取信息。有谁知道如何使这项工作?

7 个答案:

答案 0 :(得分:24)

您可以在Audiomanager类的帮助下获取当前媒体播放器的数量。代码如下: -

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

同样,如果你想设置媒体播放器的默认音量。你可以这样做: -

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

这就是全部......快乐的编码:)

答案 1 :(得分:9)

我认为你必须使用AudioManager。正如API所述,它可以用于音量控制:

  

AudioManager提供对卷的访问   和振铃模式控制。

     

使用   Context.getSystemService(Context.AUDIO_SERVICE)   获取这个类的实例。

然后我认为this method会很有用。

答案 2 :(得分:9)

你很幸运。有一个叫做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>

答案 3 :(得分:1)

我一直在寻找一种方法来做something similar一段时间。我真的希望能够看到通过媒体流播放的任何内容的音量/幅度,但我会满足于能够为我正在播放的内容进行播放。

到目前为止,我发现的最佳解决方案是在RingDroid中实现的。我没有深入研究过代码,但看起来RingDroid创建声音图的方式是通过实际分析声音文件。

我考虑过使用类似的方法然后显示一个与音频文件分开运行的可视化工具,但是以同步的速度运行。然而,对于应该更简单的事情来说,这似乎太过分了。

答案 4 :(得分:1)

您必须在DataLine中实现getLevel()。这与Java中的总线非常接近。

这涉及计算来自声音流缓冲器的幅度(波形)数据的运行平均值。

这导致很多总线流量访问缓冲区,所以留下作为抽象方法。

均方根(RMS)是一种方法:

https://community.oracle.com/message/5391003

带有FFT的DSP(例如Visualizer类)提供了完整的频谱,但消耗了更多的CPU资源。

如果您需要的只是RMS(例如,简单的节拍检测),请不要对完整的DSP进行抨击。限制样品质量以提高性能。

答案 5 :(得分:0)

我有此解决方案:

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

答案 6 :(得分:0)

如下:

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);