Frage

Ich arbeite an einer Anwendung, die sowohl Aufzeichnung eine Audiodatei, und dann die Möglichkeit, die Datei wiederzugeben, sobald es aufgenommen wurde. Die Benutzeroberfläche hat eine EQ-Komponente, die auf die Stromamplitude des Aufzeichnungs relative animiert. Ich habe die Animation bekam über die MediaRecorder.getMaxAmplitude() Methode funktioniert, aber keine Mittel und Wege finden, um dies zu tun mit Mediaplayer. Ich weiß, dass es möglich sein muss, da es Musik Visualisierung Live Wallpaper standardmäßig ist, die diese Funktionalität ausführen, aber ich kann keine Möglichkeit sehen, dass sie diese Informationen zerren, wenn sie durch AOSP Kämme. Weiß jemand, wie man diese Arbeit machen?

War es hilfreich?

Lösung

Ich glaube, Sie verwenden müssen Audio-Manager . Da die API heißt es kann zur Lautstärkeregelung verwendet werden:

bietet Audio-Manager Zugriff auf Lautstärke und Klingelmodus-Steuerung.

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

Dann denke ich diese Methode würde nützlich sein.

Andere Tipps

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 das Standardvolumen von Medien festlegen möchten player.You kann das tun, wie zum Beispiel: -

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

Das ist all..Happy Codierung:)

Sie haben Glück. Es gibt eine Klasse namens Visualizer, die das tun, 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 werden 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>

Sie haben GetLevel () in Dataline zu implementieren. Das ist so nah an dem Bus, wie es erhält in Java.

Dies beinhaltet eine Berechnung der mittlere Fahr der Amplitude (Wellenform) Daten aus dem Strompuffer Schall.

Dies bewirkt, dass eine Menge des Busverkehrs die Puffer zugreifen, so gelassen wie abstrakte Methode.

Root Mean Square (RMS) ist ein Ansatz:

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

DSP mit FFT (z. B. Visualizer Klasse) gibt ein komplettes Frequenzspektrum, verbraucht aber viel mehr CPU-Ressourcen.

Sie nicht auf volle DSP zuzuschlagen, wenn alles, was Sie benötigen RMS ist (z. B. einfache Beat-Erkennung). Begrenzen Sie die Qualität Ihrer Proben, um die Leistung zu verbessern.

Ich habe nach einer Möglichkeit gesucht, etwas ähnliches zu tun für eine Weile. Ich möchte wirklich in der Lage sein das Volumen / Amplitude etwas sehen über den Media-Stream abgespielt wird, aber ich werde zufrieden geben, es zu tun in der Lage, für etwas, das ich zur Zeit bin zu spielen.

Bisher ist die beste Lösung, die ich gefunden habe ist in Ringdroid . Ich habe nicht in den Code schaute zu tief, aber es sieht aus wie die Art und Weise, dass Ringdroid seine Soundmap schafft, ist durch tatsächlich die Tondatei bitweise zu analysieren.

Ich habe einen ähnlichen Ansatz in Betracht gezogen und anschließend die Anzeige eine Visualizer, dass Läufe aus der Audiodatei zu trennen, sondern läuft mit einem synchronisierten Tempo. Allerdings scheint dies zu viel Arbeit für etwas, das Art und Weise einfacher sein sollte.

Ich habe diese Lösung:

final int volume_level = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = (float) volume_level / maxVolume;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top