Android 使用VolumeShaper控制声音效果

2022-02-20  本文已影响0人  gaookey
image.png

Android 8 新增了 VolumeShaper 来控制声音效果,VolumeShaper 可实现音量的淡入、淡出等自动音量转换效果。

使用 VolumeShaper 进行音量控制实际上是通过 VolumeShaper.Configuration 来实现的,创建该对象时主要通过三个方法来指定三个参数。

  1. 持续时间 (duration):指定该声音效果的持续时间,以毫秒为单位。
  2. 插值方式 (interpolator type):指定声音变化的插值方式。
  3. 音量曲线(volume curve):指定音量变化的曲线。该参数需要两个长度相同的数组,第一个数组表示各时间点,第二个数组表示各时间点对应的音量。比如指定 [0f, 0.5f, 1.0f][0f,1.0f, 0f] 两个数组,表示在声音效果的开始处音量为 0,中间处音量为 1,结尾处音量为 0。从上面的介绍可以看出,第一个数组表示声音效果的时间线,因此第一个数组元素必须是 0f,最后一个数组元素必须是 1.0f;第二个数组各元素的值表示音量的比例,因此这些数组元素值必须在 0f~1f之间。

上面第二个参数指定的插值方式支持如下几个属性值。

在创建了 VolumeShaper.Configuration 对象之后,接下来调用支持 VolumeShaper 的声音播放器(如 MediaPlayerAudioTrack)的 createVolumeShaper() 方法创建 VolumeShaper 即可。

在使用声音播放器创建 VolumeShaper 之后,还必须调用 VolumeShaperplay() 方法;否则,只有第一个音量控制点指定的音量会作用于该声音效果。

使用 VolumeShaper 控制声音效果的步骤如下。

  1. 创建 VolumeShaper.Configuration 对象,在创建该对象时需要指定持续时间、音量曲线、插值方式这三个参数。
  2. 调用声音播放器的 createVolumeShaper() 方法创建 VolumeShaper 对象。
  3. 调用 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版)》

上一篇 下一篇

猜你喜欢

热点阅读