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.