Come posso get il volume / ampiezza corrente in un Android MediaPlayer?

Sto lavorando su un'applicazione che registrerà un file audio e potrà quindi riprodurre il file una volta che è stato registrato. L'UI ha un componente EQ che anima rispetto alla corrente ampiezza della logging. Ho l'animation che funziona tramite il metodo MediaRecorder.getMaxAmplitude (), ma non riesco a trovare alcun mezzo per farlo con MediaPlayer. So che deve essere ansible poiché non ci sono visualizzazioni di musica Live Wallpapers per impostazione predefinita che eseguono questa funzionalità ma non riesco a vedere in alcun modo che sta tirando queste informazioni quando si pettina attraverso AOSP. Qualcuno sa come fare questo lavoro?

  • Android Studio IDE su Mac os: error = 13, authorization negata
  • Dimensione del mucchio Android su diversi telefoni / dispositivi e versioni OS
  • Android Widget Lifecycle
  • Android Volley Restituisce i risultati due volte per una richiesta
  • Visualizzare i contatti nell'ordine di sorting ContattiContract.Contacts di Content Resolver
  • Creazione di un XML per elementi creati dynamicmente
  • 5 Solutions collect form web for “Come posso get il volume / ampiezza corrente in un Android MediaPlayer?”

    Penso che devi usare AudioManager . Come afferma l'API può essere utilizzato per il controllo del volume:

    AudioManager fornisce l'accesso al controllo del modo di volume e suoneria.

    Utilizza Context.getSystemService (Context.AUDIO_SERVICE) per get un'istanza di questa class.

    Allora penso che questo metodo sarebbe utile.

    È ansible get il volume corrente del lettore multimediale con l'aiuto del codice Audiomanager. Il codice è il seguente: –

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

    Allo stesso modo, se si desidera impostare il volume predefinito del lettore multimediale. Puoi farlo come: –

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

    Questo è tutto .. Codifica felice 🙂

    Sei nella fortuna. C'è una class chiamata Visualizer che farà quello che vuoi che penso.

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

    avnetworking bisogno di queste autorizzazioni:

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

    Sto cercando un modo per fare qualcosa di simile per un po '. Voglio veramente capire il volume / ampiezza di tutto ciò che viene suonato sul stream multimediale, ma mi impegnerò per essere in grado di farlo per qualcosa che sto attualmente giocando.

    Finora, la soluzione migliore che ho trovato è implementata in RingDroid . Non ho guardato troppo in profondità il codice, ma sembra che RingDroid crea il suo soundmap effettivamente analizzando bit di bit il file audio.

    Ho preso in considerazione l'utilizzo di un approccio simile e visualizzando un visualizzatore che viene eseguito separato dal file audio, ma viene eseguito in modo sincronizzato. Tuttavia, questo sembra troppo lavoro per qualcosa che dovrebbe essere più semplice.

    Devi implementare getLevel () in DataLine. Questo è quanto più vicino al bus come si ottiene in Java.

    Ciò comport il calcolo di una media media di dati di ampiezza dal buffer di stream sonoro. Ciò causa un sacco di traffico bus per accedere al buffer, quindi lasciato come metodo astratto.

    Root Square Mean RMS è un approccio:

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

    DSP con FFT fornisce un profilo sonoro più completo, ma consuma molto più risorse della CPU. Non slam su DSP completo se tutto ciò che serve è RMS. Limitare la qualità dei campioni per migliorare le performance.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.