VolumeShaper で振幅を制御する

オーディオ アプリの VolumeShaper を使用すると、以下を実行できます。 フェードイン、フェードアウト、クロスフェード、ダッキング、その他の短い自動音量 使用できます。VolumeShaper クラスは Android 8.0(API レベル 26)で使用できます。 以降のバージョンです。

VolumeShaper を作成するには、インスタンスの createVolumeShaper() を呼び出します。 AudioTrack または MediaPlayer。「 VolumeShaper は、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]。

補間タイプ

音量カーブは指定されたコントロール ポイントを必ず通ります。値 に従って、スプラインによって導き出されます。 interpolator タイプを指定します。使用可能なパラメータには 4 つの定数が VolumeShaper interpolator タイプ:

  • 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.PLAYapply() メソッドを呼び出すまで続きます。変更後 シェーパーを作成するので、apply() の最初の呼び出しで PLAY を指定する必要があります。 シェイパーを開始する必要があります。これにより、曲線の始点から終点、 最後のコントロール ポイント:

Kotlin

shaper.apply(VolumeShaper.Operation.PLAY)

Java

shaper.apply(VolumeShaper.Operation.PLAY);

シェーパーの実行中に、apply() 呼び出しを交互に発行して、 REVERSE オペレーションと PLAY オペレーション。これにより、読み上げの方向が 自動的に適用されます。

シェイパーは継続的に音量を調整し、すべてのコントロール ポイントを通過します。 有効期限は期限になります。これは、シェイパーが最後の または 1 番目の制御ポイント(REVERSE 操作の場合)です。

シェイパーが終了しても音量は最後の設定のまま( 最初のコントロール ポイントか最後のコントロール ポイントかを指定できます。VolumeShaper.getVolume() に発信して、 現在の音量に変更できます。

シェーパーが期限切れになったら、別の apply() 呼び出しを発行して曲線を実行できます。 移動しますたとえば、シェイパーが実行中に期限切れになった場合などは、 PLAY。次の apply()REVERSE にする必要があります。PLAY の後に PLAY に発信: 期限切れになった、または REVERSE が経過した後の REVERSE が有効にならない。

PLAY オペレーションと REVERSE オペレーションは交互に行う必要があります。コンテンツの再生や 最初のコントロール ポイントから最後のコントロール ポイントまで移動し、その後もう一度 最初のコントロール ポイントになります。replace() メソッドを使用できます。これについては、次の セクションを使用して、曲線をそのコピーに置き換えます。シェイパーがリセットされ PLAY オペレーションを再起動する必要があります。

カーブを変更する

VolumeShaper のカーブを変更するには、replace() メソッドを使用します。このメソッドは、 構成、演算、結合パラメータが含まれますこの関数を呼び出すには、 シェイパーの実行中または期限切れ後に、いつでも replace() メソッドにアクセスできます。

Kotlin

Val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1,000)
        .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
値結合 = true
shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join)

Java

VolumeShaper.Configuration newConfig =
  新しい VolumeShaper.Configuration.Builder()
    .setDuration(1,000)
    .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
ブール値結合 = true;
shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);

シェイパーの実行中に replace() を呼び出すと、 現在の値のままとなります。その後、シェイパーは新しい 最初のコントロール ポイントから開始できます。つまり、操作の引数は シェイパーを呼び出し後に実行するかどうかを制御します。PLAY の指定先 すぐに新しいカーブを開始します。シェーパーを次の場所で一時停止する場合は REVERSE を指定します。 新しいカーブの最初のコントロール ポイントの音量です。シェイパーと 後で apply(VolumeShaper.Operation.PLAY) を使用します。

join = false を指定して replace() を呼び出すと、シェイパーは曲線の開始位置で曲線を開始します。 最初のコントロール ポイントで指定されたレベル。これにより 不連続性や不連続性の 表示されます。これを回避するには、join = true を指定して replace() を呼び出します。 これにより、新しい曲線の最初の制御点が、 最初のシェーパーと最初の地点間のすべてのコントロール ポイントの音量を 最後に、新しい曲線の相対的な形状を維持します(最後のコントロール ポイントは 変更はありません)。スケーリング オペレーションでは、オブジェクトのコントロール ポイントが永続的に変更され、 新しい曲線を作成します。

VolumeShaper を削除する

AudioTrack または実行時に VolumeShaper が終了し、ガベージ コレクションが行われる MediaPlayer はリリースされたか、使用されなくなりました。close() メソッドを呼び出すことができます。 シェイパーを使ってすぐに破棄できます。シェイパーが 約 20 ミリ秒以内に完了できます。VolumeShaper を閉じるときは注意する 。呼び出し時にシェイパーの音量が 1.0 未満の場合は、 close(): シェイパーの音量スケールが 1.0 に変更されます。これにより、 検出します。