Android 使用VolumeShaper控制声音效果
2022-02-20 本文已影响0人
gaookey
image.png
Android 8 新增了 VolumeShaper
来控制声音效果,VolumeShaper
可实现音量的淡入、淡出等自动音量转换效果。
使用 VolumeShaper
进行音量控制实际上是通过 VolumeShaper.Configuration
来实现的,创建该对象时主要通过三个方法来指定三个参数。
- 持续时间 (duration):指定该声音效果的持续时间,以毫秒为单位。
- 插值方式 (interpolator type):指定声音变化的插值方式。
- 音量曲线(volume curve):指定音量变化的曲线。该参数需要两个长度相同的数组,第一个数组表示各时间点,第二个数组表示各时间点对应的音量。比如指定
[0f, 0.5f, 1.0f]
和[0f,1.0f, 0f]
两个数组,表示在声音效果的开始处音量为0
,中间处音量为1
,结尾处音量为0
。从上面的介绍可以看出,第一个数组表示声音效果的时间线,因此第一个数组元素必须是0f
,最后一个数组元素必须是1.0f
;第二个数组各元素的值表示音量的比例,因此这些数组元素值必须在0f~1f
之间。
上面第二个参数指定的插值方式支持如下几个属性值。
-
VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
使用分段曲线的方式控制音量变化。 -
VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
使用线性的插值方式控制音量变化。 -
VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
使用三次曲线的插值方式控制音量变化。 -
VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
使用保持局部单调的三次曲线的插值方式控制音量变化。
在创建了 VolumeShaper.Configuration
对象之后,接下来调用支持 VolumeShaper
的声音播放器(如 MediaPlayer
或 AudioTrack
)的 createVolumeShaper()
方法创建 VolumeShaper
即可。
在使用声音播放器创建 VolumeShaper
之后,还必须调用 VolumeShaper
的 play()
方法;否则,只有第一个音量控制点指定的音量会作用于该声音效果。
使用 VolumeShaper 控制声音效果的步骤如下。
- 创建
VolumeShaper.Configuration
对象,在创建该对象时需要指定持续时间、音量曲线、插值方式这三个参数。 - 调用声音播放器的
createVolumeShaper()
方法创建VolumeShaper
对象。 - 调用
VolumeShaper
对象的play()
方法。
声音先逐渐变大(淡入)、再逐渐变小 (淡出)
public class MainActivity extends AppCompatActivity {
// 定义播放声音的MediaPlayer
private MediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建MediaPlayer对象
mPlayer = MediaPlayer.create(this, R.raw.beautiful);
Button bnBn = findViewById(R.id.play);
// 为“播放”按钮绑定事件处理函数
bnBn.setOnClickListener(view -> mPlayer.start());
Button shaperBn = findViewById(R.id.shaper);
// 为“应用效果”按钮绑定事件处理函数
shaperBn.setOnClickListener(view -> {
VolumeShaper.Configuration config = new VolumeShaper.Configuration.Builder()
// 设置插值方式
.setInterpolatorType(VolumeShaper.
Configuration.INTERPOLATOR_TYPE_LINEAR)
// 设置音量曲线
.setCurve(new float[]{0f, 0.5f, 1f}, // 时间点
new float[]{0f, 1f, 0f}) // 各时间点对应的音量
// 设置持续时间
.setDuration(1000 * 60 * 2)
.build();
VolumeShaper volumeShaper = mPlayer.createVolumeShaper(config);
volumeShaper.apply(VolumeShaper.Operation.PLAY);
});
}
}
摘抄至《疯狂Android讲义(第4版)》