Как получить текущий объем / амплитуду в MediaPlayer? - PullRequest
19 голосов
/ 28 мая 2010

Я работаю над приложением, которое будет одновременно записывать аудиофайл, а затем иметь возможность воспроизводить этот файл после его записи. Пользовательский интерфейс имеет компонент эквалайзера, который анимируется относительно текущей амплитуды записи. У меня есть анимация, работающая с помощью метода MediaRecorder.getMaxAmplitude(), но я не могу найти никаких средств, чтобы сделать это с MediaPlayer. Я знаю, что это должно быть возможно, поскольку по умолчанию существуют живые обои для визуализации музыки, которые выполняют эту функцию, но я не вижу способа, чтобы он извлекал эту информацию при прочесывании через AOSP. Кто-нибудь знает, как заставить это работать?

Ответы [ 6 ]

25 голосов
/ 16 августа 2013

Текущий объем медиаплеера можно получить с помощью класса Audiomanager. Код выглядит следующим образом: -

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

Аналогично, если вы хотите установить громкость медиаплеера по умолчанию. Вы можете сделать это, например: -

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

Вот и все .. Счастливое кодирование:)

9 голосов
/ 22 мая 2015

Вам повезло. Существует класс 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>
9 голосов
/ 28 мая 2010

Я думаю, вам нужно использовать AudioManager . Как утверждает API, его можно использовать для регулировки громкости:

AudioManager обеспечивает доступ к громкости и управление режимом звонка.

Использование Context.getSystemService (Context.AUDIO_SERVICE) чтобы получить экземпляр этого класса.

Тогда я думаю этот метод будет полезен.

1 голос
/ 24 декабря 2014

Вы должны реализовать getLevel () в DataLine. Это так же близко к шине, как и в Java.

Это включает в себя расчет скользящего среднего значения амплитуды (формы сигнала) из буфера звукового потока.

Это приводит к тому, что большой объем трафика шины получает доступ к буферу, поэтому оставляется как абстрактный метод.

Среднеквадратичное значение (RMS) является одним из подходов:

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

DSP с БПФ (например, класс Visualizer) дает полный частотный спектр, но потребляет гораздо больше ресурсов ЦП.

Не нажимайте на полный DSP, если все, что вам нужно, это RMS (например, простое обнаружение ударов). Ограничьте качество ваших образцов для улучшения производительности.

1 голос
/ 15 сентября 2010

Я давно искал способ сделать нечто подобное . Я действительно хочу видеть громкость / амплитуду всего, что воспроизводится в медиапотоке, но я согласен, что смогу сделать это для того, что я сейчас играю.

На данный момент лучшее решение, которое я нашел, реализовано в RingDroid . Я не слишком подробно изучил код, но похоже, что RingDroid создает звуковую карту, фактически анализируя звуковой файл постепенно.

Я подумал об использовании подобного подхода и отображении визуализатора, который работает отдельно от аудиофайла, но работает в синхронизированном темпе. Однако это кажется слишком большой работой для чего-то, что должно быть намного проще.

0 голосов
/ 07 июня 2019

Я получил это решение:

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