Android实现音频淡入淡出效果

Posted zhanghui_cuc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android实现音频淡入淡出效果相关的知识,希望对你有一定的参考价值。

淡入淡出原本是音响、功放上常有的功能,如今,在一些对音频体验要求比较高的场景下,也会有类似的需求。除此之外,音频淡入淡出效果也可以掩盖一些音频播放过程的瑕疵,优化体验。

以淡入效果为例,在android平台上最基础的实现方法就是以固定时间间隔调用mediaplayer的setVolume接口,将音量逐渐从0上升到1。调用时机方面,可以在seek时将音量置为0,收到seekComplete回调后开始上升到1。通过这种方式,你应该能在日志中看到如下的打印。当然,具体的调用时机可以依据你自己的场景来设计。

11-11 17:08:54.594 13470 13484  setVolume (left: 0.0, right: 0.0)
11-11 17:08:54.595 13470 13484  seekTo(25123)
11-11 17:08:54.622 13470 13470  notifyOnSeekComplete
11-11 17:08:54.896 13470 13484  setVolume (left: 0.1, right: 0.1)
11-11 17:08:55.170 13470 13484  setVolume (left: 0.2, right: 0.2)
11-11 17:08:55.235 13470 13484  setVolume (left: 0.3, right: 0.3)
11-11 17:08:55.302 13470 13484  setVolume (left: 0.4, right: 0.4)
11-11 17:08:55.369 13470 14913  setVolume (left: 0.5, right: 0.5)
11-11 17:08:55.422 13470 14913  setVolume (left: 0.6, right: 0.6)
11-11 17:08:55.484 13470 14913  setVolume (left: 0.7, right: 0.7)
11-11 17:08:55.539 13470 13484  setVolume (left: 0.8, right: 0.8)
11-11 17:08:55.591 13470 14913  setVolume (left: 0.90000004, right: 0.90000004)
11-11 17:08:55.642 13470 13484  setVolume (left: 1.0, right: 1.0)

VolumeShaper

从Android O开始,新增了VolumeShaper类,专用于实现音频的淡入淡出效果,它的主要优势在于可以实现更复杂的音量变化曲线,但是底层还是调用的audio framework中的set volume相关的接口。著名的Netflix就是使用这个接口来实现淡入淡出效果的。

上层可以调用MediaPlayer或AudioTrack的createVolumeShaper()方法创建VolumeShaper,VolumeShaper的行为在VolumeShaper.Configuration中指定,configuration里详细地指明了音量曲线、插值类型和持续时长。

下面是一个例子,表示音量在三秒内从1降到0.2。

private static final VolumeShaper.Configuration LINEAR_DUCK =
            new VolumeShaper.Configuration.Builder()
                .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
                .setCurve(new float[] { 0.f, 1.f } /* times */,
                        new float[] { 1.f, 0.2f } /* volumes */)
                .setDuration(3000)//ms
                .build();
VolumeShaper shaper = mediaPlayer.createVolumeShaper(LINEAR_DUCK);

然后在需要应用效果的地方,如下调用VolumeShaper

shaper.apply(VolumeShaper.Operation.PLAY);

总体来说,个人感觉使用起来挺别扭的,所以如果没有特别复杂的曲线要求,我倾向于使用基础的实现方法~


欢迎关注我的公众号灰度五十,分享各类音视频、移动开发知识~
在这里插入图片描述

以上是关于Android实现音频淡入淡出效果的主要内容,如果未能解决你的问题,请参考以下文章

请问 在Android编辑mp3时,如何设置mp3的淡入淡出效果?

音频中的淡入淡出效果通过在ios中使用AVAssetExportSession

iOS 如何在 Sprite Kit 游戏中创建音频淡入/淡出效果?

Premier设置音频淡入淡出的效果

AVAssetExportSession 和淡入淡出效果

Android属性动画小练习(简单实现旋转平移淡入淡出缩放动画效果)