使用 VolumeShaper 控制振幅

你可以在音訊應用程式中使用 VolumeShaper 執行 淡入、淡出、交叉淡出、降低背景音量和其他短暫自動音量 轉場效果VolumeShaper 類別適用於 Android 8.0 (API 級別 26) 和更新的版本。

您可以在VolumeShapercreateVolumeShaper() AudioTrackMediaPlayerVolumeShaper 僅適用於 AudioTrack 或 MediaPlayer 產生的音訊 建立該專案的所有專案

VolumeShaper.Configuration

VolumeShaper 的行為是由其定義 VolumeShaper.Configuration。設定會指定 *音量曲線、內插器類型和時間長度*。

音量曲線

音量曲線代表的是一段時間內的振幅變化。它是由一對 定義一系列控制點的浮點陣列、x[] 和 y[]。每個 (x, y) 組合則分別代表時間和音量。陣列的長度必須相等 ,且至少要包含 2 個值,最多 16 個。(曲線長度上限為 定義於 getMaximumCurvePoints() 中)。

時間座標是以 [0.0, 1.0] 為區間。第一次 點必須為 0.0,最後一個值必須為 1.0,而且時間必須單調 而且數量仍在持續增加

指定時間範圍內的音量座標,以線性比例表示 [0.0, 1.0]。

內插器類型

音量曲線一律會通過指定控制點。值 控制點之間是由水線所衍生,並按照 設定的內插器類型有四個常數 VolumeShaper 個內插器類型:

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

時間長度

間隔 [0.0, 1.0] 中的指定時間座標會縮放為 指定的播放時間 (以毫秒為單位)這會決定 建立形狀時,音量曲線的時間以及將曲線套用至 例如音訊輸出

使用 VolumeShaper

建立設定

建構 VolumeShaper 之前,您必須建立 VolumeShaper.Configuration 的例項。方法是使用 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})

同時開始播放和圖形。這樣可確保影片 從無聲開始,並將音量調高至最大音量。相關說明請參閱 請參閱下一節的說明。

執行 VolumeShaper

雖然第一個控制點的音量等級會套用到音訊路徑 形狀建立完成後,形狀就不會沿著曲線進度前進 直到您使用 VolumeShaper.Operation.PLAY 呼叫 apply() 方法為止。更新後 建立形狀工具,第一次叫用 apply() 時必須指定 PLAY 作業才能啟動形狀。這樣就能從頭到尾 最後的控制點:

Kotlin

Shaper.apply(VolumeShaper.Operation.PLAY)

Java

Shaper.apply(VolumeShaper.Operation.PLAY);

在 Shaper 執行期間,您可以發出交替的 apply() 呼叫,並指定 REVERSE 和 PLAY 作業。這會變更朗讀前的方向 每個控制點

形狀工具會持續調整音量,並通過所有控制點 直到過期。當形狀到達最後一個 (如果是 PLAY) 時,就會發生這種情況 運算) 或第一個 (用於 REVERSE 運算) 控制點。

形狀元件到期時,音量會維持在最後設定, 第一個或最後一個控制點你可以致電「VolumeShaper.getVolume()」: 目前的音量大小

形狀工具到期後,您可以再次發出 apply() 呼叫來執行曲線 就會顯示反向的閃光效果舉例來說,如果形狀工具在執行期間過期 PLAY,下一個 apply() 必須為 REVERSE。在 PLAY 後撥打 PLAY 到期,或REVERSE到期後 REVERSE,則沒有任何作用。

您必須替代 PLAYREVERSE 作業。你無法播放 從第一個控制點到最後一個控制點,再從 第一個控制點您可以使用 replace() 方法,如下一節所述 部分中,將曲線替換為本身的副本。這項動作會重設形狀 則需要 PLAY 作業才能再次啟動。

變更曲線

使用 replace() 方法即可變更 VolumeShaper 的曲線。這個方法 設定、作業和彙整參數。您可以呼叫 replace() 方法。當 Shaper 執行時或形狀到期後,隨時都可以執行以下動作:

Kotlin

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

Java

VolumeShaper.Configuration newConfig =
  新的 VolumeShaper.Configuration.Builder()
    .setDuration(1000)
    .setCurve(新浮點值 [] {0.f, 0.5f}, 新浮點值 [] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
布林彙整 = true;
Shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);

如果您在 Shaper 執行期間呼叫 replace(),會停止變更 並保持目前的值接著,形狀工具會嘗試開始新的 從第一個控制點開始曲線也就是說 控制 Shaper 在呼叫後是否執行。將 PLAY 指定為 立即開始新曲線,指定 REVERSE 讓形狀在以下位置維持暫停狀態 新曲線上第一個控制點的音量。你可以啟動這個形狀 稍後使用 apply(VolumeShaper.Operation.PLAY)

使用 join = false 呼叫 replace() 時,形狀工具會從 受到第一個控制點指定的等級這可能會導致遊戲中斷 音量如要避免這種情況發生,可以使用 join = true 呼叫 replace()。 這會將新曲線的第一個控制點設為 形狀和調整第一個和 最後是維持新曲線的相對形狀 (最後一個控制點是 不變)。縮放作業會永久變更 形狀的全新曲線

移除 VolumeShaper

系統會關閉並垃圾收集 VolumeShaper,其 AudioTrackMediaPlayer 發布或不再使用。您可以呼叫 close() 方法 即可立即刪除形狀系統會將形狀從 音訊管道。關閉VolumeShaper時請務必謹慎 以及是否要繼續播放撥打電話時,如果形狀的音量低於 1.0 close(),形狀工具的音量比例會變更為 1.0。這可能會導致突然