Amplitude mit VolumeShaper steuern

Du kannst VolumeShaper in einer Audio-App verwenden, um Ein- und Ausblendungen, Überblendungen, Ducking und andere kurze automatisierte Lautstärken Übergänge. Die Klasse VolumeShaper ist in Android 8.0 (API-Level 26) verfügbar. und später.

Sie erstellen ein VolumeShaper, indem Sie createVolumeShaper() für eine Instanz von aufrufen: AudioTrack oder MediaPlayer. Die VolumeShaper wirkt sich nur auf die Audioinhalte aus, die mit dem AudioTrack oder MediaPlayer produziert wurden. der sie erstellt hat.

VolumeShaper.Configuration

Das Verhalten einer VolumeShaper wird durch ihre VolumeShaper.Configuration. Die Konfiguration legt eine *Volumenkurve, Interpolatortyp und Dauer.*

Lautstärkekurve

Die Lautstärkekurve stellt die Amplitudenänderung im Zeitverlauf dar. Sie wird durch ein Paar definiert, aus Gleitkommazahlen-Arrays, x[] und y[], die eine Reihe von Kontrollpunkten definieren. Jedes (x, y) Paar für Zeit und Volumen. Die Arrays müssen die gleiche Länge haben. und mindestens 2 und nicht mehr als 16 Werte enthalten. Die maximale Kurvenlänge beträgt definiert in getMaximumCurvePoints().)

Die Zeitkoordinaten werden über das Intervall [0.0; 1.0] angegeben. Beim ersten Mal Punkt 0,0, der letzte Punkt 1,0 und die Zeiten müssen monoton sein steigt.

Die Volumenkoordinaten sind in linearer Skala über das Intervall angegeben [0.0; 1.0].

Interpolatortyp

Die Lautstärkekurve verläuft immer durch die angegebenen Kontrollpunkte. Werte zwischen den Kontrollpunkten werden durch einen Spline-Diagramm den Interpolatortyp der Konfiguration. Es gibt vier Konstanten für die verfügbaren Interpolatortypen VolumeShaper:

  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC

Dauer

Die angegebenen Zeitkoordinaten im Intervall [0.0; 1.0] sind auf eine Dauer in Millisekunden angeben. Dadurch wird die tatsächliche Länge in der Volumenkurve, wenn der Shaper läuft und die Kurve auf die Audioausgabe.

VolumeShaper verwenden

Konfiguration erstellen

Bevor Sie ein VolumeShaper erstellen, müssen Sie eine Instanz von VolumeShaper.Configuration erstellen. Verwenden Sie dazu ein VolumeShaper.Configuration.Builder():

Kotlin

val config: VolumeShaper.Configuration = VolumeShaper.Configuration.Builder()
        .setDuration(3000)
        .setCurve(floatArrayOf(0f, 1f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()

Java

VolumeShaper.Configuration config =
  new VolumeShaper.Configuration.Builder()
      .setDuration(3000)
      .setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
      .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
      .build();

With no arguments the VolumeShaper.Configuration.Builder constructor returns a builder that creates a configuration with default settings: INTERPOLATOR_TYPE_CUBIC, a one second duration, and no curve. You must add a curve to the builder before calling build().

The framework provides constants for configurations with pre-built curves, each with one second duration:

  • VolumeShaper.Configuration.LINEAR_RAMP
  • VolumeShaper.Configuration.CUBIC_RAMP
  • VolumeShaper.Configuration.SINE_RAMP
  • VolumeShaper.Configuration.SCURVE_RAMP

Creating a VolumeShaper

To create a VolumeShaper, call createVolumeShaper() on an instance of the appropriate class, passing in a VolumeShaper.Configuration:

Kotlin

volumeShaper = myMediaPlayer.createVolumeShaper(config)
volumeShaper = myAudioTrack.createVolumeShaper(config)

Java

volumeShaper = myMediaPlayer.createVolumeShaper(config);
volumeShaper = myAudioTrack.createVolumeShaper(config);

A single track or media player can have many shapers attached to it, and you can control each shaper separately. The outputs of all the shapers on a track or player are multiplied together. A VolumeShaper cannot be shared between AudioTracks or MediaPlayers, but you can use the same configuration in calls to createVolumeShaper to build identical shapers on multiple AudioTracks or MediaPlayers.

When you create the shaper, its first control point (at t = 0) is applied to the audio stream. If the initial volume is not 1.0 and your app is playing material at create time, your audio might have an abrupt change in volume. Best practice is to start playing audio from silence and use a VolumeShaper to implement a fade-in when playback starts. Create a VolumeShaper that starts at 0 volume and fades up. For example:

setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})

Starten Sie die Wiedergabe und den Shaper gleichzeitig. Dadurch wird die Wiedergabe beginnt im Lautlos-Modus und die Lautstärke steigt auf volle Lautstärke an. Dies wird unter im nächsten Abschnitt.

VolumeShaper ausführen

Obwohl die Lautstärke des ersten Kontrollpunkts auf den Audiopfad angewendet wird, Sobald der Shaper erstellt wurde, schreitet er nicht die Kurve entlang. bis Sie die Methode apply() mit VolumeShaper.Operation.PLAY aufrufen. Nachher beim Erstellen des Shapers, muss beim ersten Aufruf von apply() die PLAY angegeben werden um den Shaper zu starten. So verläuft die Kurve vom ersten bis zum Letzte Kontrollpunkte:

Kotlin

shaper.apply(VolumeShaper.Operation.PLAY)

Java

shaper.apply(VolumeShaper.Operation.PLAY);

Während der Shaper ausgeführt wird, können Sie abwechselnde apply()-Aufrufe ausführen und angeben, REVERSE und PLAY. Dadurch ändert sich die Leserichtung des jedes Mal Kontrollpunkte.

Der Shaper passt die Lautstärke kontinuierlich an und durchläuft alle Kontrollpunkte bis sie abläuft. Dies geschieht, wenn der Shaper den letzten erreicht hat (für PLAY oder den ersten (für den REVERSE-Vorgang) Kontrollpunkt in der Kurve.

Wenn der Shaper abläuft, bleibt die Lautstärke auf der letzten Einstellung, die möglicherweise den ersten oder letzten Kontrollpunkt. Sie können VolumeShaper.getVolume() anrufen für jederzeit auf die aktuelle Lautstärke einstellen.

Nachdem der Shaper abgelaufen ist, können Sie einen weiteren apply()-Aufruf ausführen, um die Kurve auszuführen. in die entgegengesetzte Richtung. Wenn der Shaper während der Ausführung abgelaufen ist, PLAY, muss der nächste apply()-Wert REVERSE sein. PLAY wird angerufen, nachdem PLAY abgelaufen oder REVERSE nach Ablauf des REVERSE hat keine Wirkung.

Sie müssen den PLAY- und den REVERSE-Vorgang abwechseln. Es gibt keine Möglichkeit, Kurve von den ersten bis zum letzten Kontrollpunkt an. ersten Kontrollpunkts. Sie können die im Folgenden beschriebene replace()-Methode verwenden: -Abschnitt, um die Kurve durch eine Kopie von sich selbst zu ersetzen. Dadurch wird der Shaper zurückgesetzt bei denen der Vorgang PLAY noch einmal gestartet werden muss.

Kurve ändern

Mit der Methode replace() können Sie die Kurve einer VolumeShaper ändern. Diese Methode nimmt eine Konfiguration, einen Vorgang und einen Join-Parameter. Sie können die Methode replace() jederzeit ausführen, während der Shaper ausgeführt wird oder nachdem er abgelaufen ist:

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1000)
        .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
val Join = true
shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join)

Java

VolumeShaper.Configuration newConfig =
  new VolumeShaper.Configuration.Builder()
    .setDuration(1000)
    .setCurve(new float[] {0.f, 0.5f}, neue Gleitkommazahl[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build()
Boolescher Join = true;
shaper.Replacement(newConfig, VolumeShaper.Operation.PLAY, join);

Wenn Sie replace() aufrufen, während der Shaper ausgeführt wird, ändert er den Parameter Lautstärke und bleibt auf dem aktuellen Wert. Dann versucht der Shaper, die neue vom ersten Kontrollpunkt aus. Das bedeutet, dass das Vorgangsargument steuert, ob der Shaper nach dem Aufruf ausgeführt wird. PLAY angeben für die neue Kurve sofort starten, geben Sie REVERSE an, um den Shaper pausiert zu lassen bei die Lautstärke des ersten Kontrollpunkts in der neuen Kurve. Sie können den Shaper starten, später mit apply(VolumeShaper.Operation.PLAY).

Wenn Sie replace() mit join = false aufrufen, beginnt der Shaper seine Kurve bei die durch den ersten Kontrollpunkt angegebene Ebene. Dies kann zu einer Diskontinuität führen. in der Lautstärke. Sie können das vermeiden, indem Sie replace() mit join = true aufrufen. Damit wird der erste Kontrollpunkt der neuen Kurve auf die aktuelle Ebene der Shaper und skaliert die Lautstärke aller Kontrollpunkte vom ersten bis zum um die relative Form der neuen Kurve beizubehalten. Der letzte Kontrollpunkt ist unverändert). Durch den Skalierungsvorgang werden die Kontrollpunkte im Bereich die neue Kurve des Shapers.

VolumeShaper entfernen

Das System wird geschlossen und eine VolumeShaper wird von der automatischen Speicherbereinigung bereinigt, wenn AudioTrack oder MediaPlayer wurde freigegeben oder wird nicht mehr verwendet. Sie können die Methode close() aufrufen, um ihn sofort zu zerstören. Das System entfernt den Shader aus dem Audiopipeline innerhalb von etwa 20 ms. Vorsicht beim Schließen von VolumeShaper während die Audiowiedergabe gestartet wird. Wenn der Shaper beim Aufruf eine Lautstärke von weniger als 1,0 hat: close() ändert sich die Volumenskala des Shapers auf 1, 0. Dies kann zu einer plötzlichen Volumen erhöhen.