studio mediaplayer mecool example ejemplo developer create android android-mediaplayer

mecool - mediaplayer create android example



¿Cómo obtengo el volumen/amplitud actual en un MediaPlayer? (5)

Estoy trabajando en una aplicación que grabará un archivo de audio y luego tendrá la opción de reproducir ese archivo una vez que se haya grabado. La interfaz de usuario tiene un componente de EQ que se anima en relación con la amplitud actual de la grabación. Tengo la animación funcionando a través del método MediaRecorder.getMaxAmplitude() , pero no puedo encontrar ningún medio para hacer esto con MediaPlayer. Sé que debe ser posible ya que, en forma predeterminada, los Live Wallpapers de visualización de música ejecutan esta funcionalidad, pero no veo ninguna forma de que obtenga esa información cuando se peina a través de AOSP. ¿Alguien sabe cómo hacer que esto funcione?


Creo que tienes que usar AudioManager . Como indica la API, se puede utilizar para el control de volumen:

AudioManager proporciona acceso al control de volumen y modo de timbre.

Utilice Context.getSystemService (Context.AUDIO_SERVICE) para obtener una instancia de esta clase.

Entonces creo que este método sería útil.


Estas de suerte. Hay una clase llamada Visualizer que hará lo que quieras, creo.

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

Necesitarás estos permisos:

<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>


He estado buscando una manera de hacer algo similar por un tiempo. Realmente quiero poder ver el volumen / amplitud de todo lo que se reproduce en la transmisión de medios, pero me conformaré con poder hacerlo por algo que estoy reproduciendo actualmente.

Hasta ahora, la mejor solución que he encontrado está implementada en RingDroid . No he investigado el código demasiado a fondo, pero parece que la forma en que RingDroid crea su mapa de sonido es analizando el archivo de sonido poco a poco.

He considerado utilizar un enfoque similar y luego mostrar un visualizador que se ejecute de forma independiente del archivo de audio, pero que se ejecute a un ritmo sincronizado. Sin embargo, esto parece demasiado trabajo para algo que debería ser mucho más simple.


Puede obtener el volumen actual del reproductor multimedia con la ayuda de la clase Audiomanager. El código es el siguiente:

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

Del mismo modo, si desea configurar el volumen predeterminado del reproductor multimedia, puede hacerlo así:

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

Eso es todo ... Feliz codificación :)


Tienes que implementar getLevel () en DataLine. Esto es lo más cercano al bus que se obtiene en Java.

Esto implica el cálculo de un promedio de los datos de amplitud (forma de onda) a partir del búfer de flujo de sonido.

Esto hace que una gran cantidad de tráfico de bus acceda al búfer, por lo que se deja como método abstracto.

Root Mean Square (RMS) es un enfoque:

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

DSP con FFT (por ejemplo, clase Visualizer) proporciona un espectro de frecuencia completo, pero consume muchos más recursos de CPU.

No descargue el DSP completo si todo lo que necesita es RMS (por ejemplo, detección de latido simple). Limite la calidad de sus muestras para mejorar el rendimiento.