【Audio&Video】使用VolumeShaper控制振幅(19)

您可以VolumeShaper在音频应用中使用淡入,淡出,淡入淡出,淡入淡出以及其他短暂的自动音量转换。的VolumeShaper类是在8.0的Android(API级26)和后可用。

您VolumeShaper通过调用or的createVolumeShaper()一个实例来 创建一个。的 仅作用于通过创建它的AudioTrack或MediaPlayer的产生的音频。AudioTrackMediaPlayerVolumeShaper

注意:在这个页面上,术语“×××器”指的是a的一个实例VolumeShaper。

VolumeShaper.Configuration


a的行为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():

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();

如果没有参数,VolumeShaper.Configuration.Builder构造函数将返回一个构建器,该构建器使用默认设置创建一个配置:INTERPOLATOR_TYPE_CUBIC,持续时间为1秒,并且不包含曲线。在调用之前,您必须向构建器添加曲线build()。

该框架为具有预建曲线的配置提供了常量,每个曲线具有一秒的持续时间:

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

创建一个VolumeShaper

要创建一个VolumeShaper,请调用createVolumeShaper()相应类的实例,传入VolumeShaper.Configuration:

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

单个音轨或媒体播放器可以附加许多×××器,您可以分别控制每个×××器。音轨或播放器上所有×××器的输出都会相乘。A VolumeShaper不能在AudioTracks或之间共享 MediaPlayers,但是您可以在调用中使用相同的配置来createVolumeShaper在多个AudioTracks或 多个上创建相同的×××器MediaPlayers。

当您创建×××器时,其第一个控制点(在t = 0时)将应用于音频流。如果初始音量不是1.0,并且您的应用正在创建时播放素材,则您的音频可能会有一个突然的音量变化。最佳做法是从静音开始播放音频,并VolumeShaper在播放开始时使用a 实现淡入。创建一个VolumeShaper从0开始并逐渐消失的开始。例如:

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

同时开始播放和×××。这可确保播放从静音开始,音量逐渐增大至完整音量。这在下一节中解释。

运行VolumeShaper

尽管一旦创建了成形器,第一个控制点的音量级别就会应用于音频路径,但在您调用该apply()方法之前,成形器不会沿曲线前进VolumeShaper.Operation.PLAY。创建×××器后,第一次调用apply()必须指定PLAY 操作以启动×××器。这从第一个到最后一个控制点运行曲线:

shaper.apply(VolumeShaper.Operation.PLAY);

在×××器运行时,您可以发出apply()指定REVERSE和PLAY操作的交替呼叫。这会每次改变控制点的读出方向。

×××器连续调整音量,并通过所有控制点直至到期。当成形器到达曲线的最后一个(用于PLAY操作)或第一个(用于反向操作)控制点时,会发生这种情况。

当×××器到期时,音量保持在最后的设置,这可能是第一个或最后一个控制点。您可以随时拨打VolumeShaper.getVolume()当前音量。

在×××器到期后,您可以发出另一个apply()呼叫以反向运行曲线。例如,如果×××器在运行时过期 PLAY,则下一个apply()必须是REVERSE。呼叫PLAY后PLAY已经到期,或REVERSE后REVERSE没有任何效果已过期。

你必须交替PLAY和REVERSE操作。无法从第一个到最后一个控制点播放曲线,然后从第一个控制点再次重新启动。您可以使用replace()下一节介绍的方法将曲线替换为其自身的副本。这会重置×××器,要求PLAY操作再次启动。

改变曲线

使用该replace()方法来更改VolumeShaper曲线。该方法采用配置,操作和连接参数。您可以随时调用该 replace()方法,而×××器正在运行或到期后:

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

在replace()×××器运行时呼叫时,它会停止改变音量并保持当前值。然后×××器尝试从第一个控制点开始新的曲线。这意味着操作参数控制×××器是否在调用之后运行。指定PLAY立即开始新曲线,指定REVERSE让×××器暂停在新曲线的第一个控制点的音量。您可以随后启动×××器apply(VolumeShaper.Operation.PLAY)。

当您打电话replace()时join = false,×××器以其第一个控制点指定的级别开始曲线。这可能会导致音量不连续。您可以通过调用避免这种情况replace()有join = true。这将新曲线的第一个控制点设置为×××器的当前级别,并缩放第一个和最后一个之间所有控制点的体积,以保持新曲线的相对形状(最后一个控制点不变)。缩放操作会永久改变×××器新曲线中的控制点。

删除VolumeShaper

系统关闭和垃圾收集了VolumeShaper其时AudioTrack或 MediaPlayer在使用中被释放或不再。你可以close()在×××器上调用该方法立即销毁它。系统在大约20毫秒内从音频管道中移除×××器。关闭VolumeShaper 音频播放时请小心。如果调用者在调用时×××器的体积小于1.0 close(),则×××器的音量刻度变为1.0。这可能会导致音量突然增加。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Audio&Video】使用VolumeShaper控制振幅(19)

猜你喜欢

转载自blog.51cto.com/4789781/2130807