2010-05-27 11 views
15

Sto lavorando a un'app che registrerà entrambi un file audio e quindi avrà la possibilità di riprodurre quel file una volta che è stato registrato. L'interfaccia utente ha un componente EQ che si anima in relazione all'ampiezza corrente della registrazione. L'animazione funziona tramite il metodo MediaRecorder.getMaxAmplitude(), ma non riesco a trovare alcun modo per farlo con MediaPlayer. So che deve essere possibile dal momento che ci sono visualizzazione musicale Live Wallpapers di default che eseguono questa funzionalità, ma non riesco a vedere in alcun modo che stia tirando quelle informazioni durante la navigazione attraverso AOSP. Qualcuno sa come farlo funzionare?Come ottengo il volume/ampiezza corrente in un MediaPlayer Android?

+3

Sono confuso dalla tua risposta accettata, sembra che non ha risolto il problema dai commenti, è corretto? –

risposta

7

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

AudioManager consente di accedere al volume e al controllo della modalità suoneria.

Utilizzare Context.getSystemService (Context.AUDIO_SERVICE) per ottenere un'istanza di questa classe.

Quindi penso che this method sarebbe utile.

+8

Ecco dove stavo curiosando ma quel metodo restituisce il livello di volume attualmente impostato sul dispositivo, non il livello di riproduzione. –

+0

Dov'è la differenza? Forse stai chiedendo il volume del flusso sbagliato? – Janusz

+2

Non è una questione di volume per il flusso di riproduzione corrente, ma il volume del supporto reale che si sta riproducendo. Solo perché il volume del tuo flusso musicale è impostato al 60% non significa che il volume del suono in quel momento sia allo stesso livello. Potrebbe essere una parte tranquilla della canzone. – MattC

1

Ho cercato un modo per fare something similar per un po '. Voglio davvero essere in grado di vedere il volume/l'ampiezza di tutto ciò che viene riprodotto sul flusso multimediale, ma mi accontenterò di poterlo fare per qualcosa che sto attualmente giocando.

Finora, la soluzione migliore che ho trovato è implementata in RingDroid. Non ho esaminato il codice troppo profondamente, ma sembra che il modo in cui RingDroid crea la sua soundmap sia analizzando il file audio a poco a poco.

Ho considerato l'utilizzo di un approccio simile e quindi la visualizzazione di un visualizzatore che viene eseguito separatamente dal file audio, ma viene eseguito a un ritmo sincronizzato. Tuttavia, questo sembra troppo lavoro per qualcosa che dovrebbe essere molto più semplice.

18

È possibile ottenere il volume attuale di lettore multimediale con l'aiuto di codice audio manager class.The è la 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 dei media player.You può fare affinché, come: -

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

Ecco codifica all..Happy :)

+3

Non è quello che sta chiedendo. Sta chiedendo il livello di uscita corrente, non l'impostazione del volume. –

1

bisogna implementare GetLevel() in DataLine. Questo è il più vicino al bus che arriva in Java.

Ciò comporta il calcolo di una media corrente di dati di ampiezza dal buffer del flusso audio. Ciò causa un sacco di traffico del bus per accedere al buffer, quindi lasciato come metodo astratto.

Root quadratico medio RMS è un approccio:

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

DSP con FFT fornisce un profilo audio più completa, ma consuma molta più risorse della CPU. Non sbattere sul DSP completo se tutto ciò che serve è RMS. Limita la qualità dei tuoi campioni per migliorare le prestazioni.

7

Sei fortunato.C'è una classe chiamata Visualizer che farà quello che vuoi, 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); 
} 


} 

dovrai queste autorizzazioni:

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