2010-05-27 3 views
15

Ich arbeite an einer App, die sowohl eine Audiodatei aufnimmt als auch die Möglichkeit bietet, diese Datei nach der Aufnahme abzuspielen. Die Benutzeroberfläche verfügt über eine EQ-Komponente, die relativ zur aktuellen Amplitude der Aufnahme animiert. Ich habe die Animation über die MediaRecorder.getMaxAmplitude() Methode funktioniert, kann aber keine Mittel finden, dies mit MediaPlayer zu tun. Ich weiß, dass es möglich sein muss, da es Live Live Wallpapers standardmäßig gibt, die diese Funktionalität ausführen, aber ich sehe keine Möglichkeit, dass diese Informationen beim Durchforsten von AOSP gezogen werden. Weiß jemand, wie das funktioniert?Wie erhalte ich die aktuelle Lautstärke/Amplitude in einem Android MediaPlayer?

+3

Ich bin verwirrt durch Ihre Antwort akzeptiert, wie es scheint es das Problem nicht aus den Kommentaren lösen, ist das richtig? –

Antwort

7

Ich denke, Sie müssen AudioManager verwenden. Wie die API angibt, kann sie für die Lautstärkeregelung verwendet werden:

AudioManager bietet Zugriff auf Volume und Klingelton-Modus-Steuerung.

Verwenden Sie Context.getSystemService (Context.AUDIO_SERVICE) , um eine Instanz dieser Klasse zu erhalten.

Dann denke ich this method wäre nützlich.

+8

Das war, wo ich herum stocherte, aber diese Methode gibt den aktuell eingestellten Lautstärkepegel des Geräts zurück, nicht den Wiedergabepegel. –

+0

Wo ist der Unterschied? Vielleicht fragst du nach der Lautstärke des falschen Streams? – Janusz

+2

Es geht nicht um die Lautstärke des aktuellen Wiedergabestreams, sondern um die Lautstärke des aktuell wiedergegebenen Mediums. Nur weil die Lautstärke Ihres Musikstreams auf 60% eingestellt ist, bedeutet das nicht, dass die Lautstärke des Sounds in diesem Moment auf dem gleichen Level ist. Es könnte ein ruhiger Teil des Songs sein. – MattC

1

Ich habe nach einer Möglichkeit gesucht, something similar für eine Weile zu tun. Ich möchte wirklich die Lautstärke/Amplitude von allem, was über den Medienstream gespielt wird, sehen können, aber ich werde mich damit begnügen, es für etwas zu tun, das ich gerade spiele.

Bis jetzt ist die beste Lösung, die ich gefunden habe, in RingDroid implementiert. Ich habe den Code nicht zu tief betrachtet, aber es sieht so aus, als ob RingDroid seine Soundkarte erstellt, indem er die Sounddatei nach und nach analysiert.

Ich habe überlegt, einen ähnlichen Ansatz zu verwenden und dann einen Visualizer anzuzeigen, der getrennt von der Audiodatei ausgeführt wird, aber in einem synchronisierten Tempo ausgeführt wird. Dies scheint jedoch zu viel Arbeit für etwas zu sein, das viel einfacher sein sollte.

18

Sie können das aktuelle Volumen von Media-Player mit Hilfe von Audiomanager class.The Code ist wie folgt: -

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

Und falls Sie können das Standardvolumen von Medien player.You festlegen möchten das tun, wie zum Beispiel: -

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

das ist, all..Happy Codierung :)

+3

Das ist nicht was er fragt. Er fragt nach dem aktuellen Ausgangspegel, nicht nach der Lautstärkeeinstellung. –

1

Sie haben GetLevel() in Dataline zu implementieren. Dies ist so nah am Bus wie es in Java ist.

Hierbei wird ein laufender Durchschnitt der Amplitudendaten aus dem Soundstream-Puffer berechnet. Dies verursacht, dass viel Busverkehr auf den Puffer zugreift, also als abstrakte Methode.

quadratischer Mittelwert RMS ist ein Ansatz:

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

DSP mit FFT gibt eine vollständigere Tonprofil, verbraucht aber viel mehr CPU-Ressourcen. Schlagen Sie nicht auf volle DSP, wenn Sie nur RMS benötigen. Beschränken Sie die Qualität Ihrer Proben, um die Leistung zu verbessern.

7

Sie haben Glück.Es gibt eine Klasse namens Visualizer, die tun wird, was Sie wollen, denke ich.

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


} 

Sie diese Berechtigungen benötigen:

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