目录

1.前言

2.基本代码

3.延伸思考问题

4.开始播放-淡入

5.停止播放-淡出

6.完整基本代码修改


1.前言

由于切歌会有爆破音的问题。方案有很多,比如音频合成淡入淡出fadein,fadeout,添加空白音源,这些侵入性比较大,我这边采用的方式是直接,调整音量模拟这个流程。为了方便控制和方便添加插值器,我采用的是

ValueAnimator

作为倒计时,方便取消和管控,该功能需要根据你项目实际需求和播放器进行微调

2.基本代码

具体参数根据实际变化调整

1.ValueAnimator.ofFloat(0f, 1f, 1f) 由于我使用的播放器是采用百分比设置音量,所以参数是0-1f

为避免使用不当最后音量变不回来了,所以我还是选用了ValueAnimator的第三个参数 1f复归

2.DURATION_IN 渐变时间选择

private ValueAnimator animfadeIn = ValueAnimator.ofFloat(0f, 1f, 1f);private ValueAnimator animfadeOut = ValueAnimator.ofFloat(1f, 0f, 1f);private static final long DURATION_IN = 500;private static final long DURATION_OUT = 500;
private void fadeIn() {animfadeIn.setDuration(DURATION_IN);animfadeIn.setInterpolator(new AccelerateInterpolator());animfadeIn.addUpdateListener(animation -> {float currentValue = (float) animation.getAnimatedValue();Log.d(TAG, "mPlayer.getVolume() value is " + mPlayer.getVolume());Log.d(TAG, "fadeIn value is " + currentValue + "  " + animation.isRunning());mPlayer.setVolume(currentValue);});animfadeIn.start();}private void fadeOut() {animfadeOut.setDuration(DURATION_OUT);animfadeOut.setInterpolator(new DecelerateInterpolator());animfadeOut.addUpdateListener(animation -> {float currentValue = (float) animation.getAnimatedValue();Log.d(TAG, "mPlayer.getVolume() value is " + mPlayer.getVolume());Log.d(TAG, "fadeOut value is " + currentValue + "  " + animation.isRunning());mPlayer.setVolume(currentValue);});animfadeOut.start();}

3.延伸思考问题

比如你只是普通做个淡出那么使用方式就是

pause() -> fadeOut()

问题1.这时候你会发现万一我pause够快,那么fadeout岂不是没有效果?我都已经播放完了

那么我加个回调试试类似添加空白音频我们让其多播放一会,在音量达到0的时候,监听其播放完再真正pause

   animfadeOut.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);pause();}});

问题2.用户同时触发多个操作。比如触发了下一曲就会执行stop/pause和play,或者我疯狂点下一曲

这时候是不是就有多个延时命令会触发,还有可能多个倒计时同时执行

animfadeOut和animfadein在run。岂不是就返回执行了最后的回调 所以在必要的时候我们需要先
animfadeOut.cancel();animfadeIn.cancel();

问题3. onAnimationEnd会多次触发 cancel也会触发end

结合上面3个问题,再结合我自己的需求。最终代码如下:

4.开始播放-淡入

调用,因为出声和渐变音量是一起的,所以播放不能等回调结束

    @Overridepublic boolean play(Audio audio) {// 你的其他播放准备代码 fadeAnimCancel("play");fadeAnim("play", true, new AnimatorBean(success -> {LogUtil.d(TAG, "fadeAnim  play success");// 边播边放大音量}));// 你的正式开始播放代码mPlayer.play();return true;}

5.停止播放-淡出

    @Overridepublic void stop() {fadeAnimCancel("stop");fadeAnim("stop", false, new AnimatorBean(success -> {LogUtil.d(TAG, "fadeAnim  stop success");// 多播放一段时间降音量的再停止// 你的停止播放代码mPlayer.stop();}));}

6.完整基本代码修改

/*** 解决切歌爆破音问题* @param reason* @param isIn* @param animatorBean*/private void fadeAnim(String reason, boolean isIn, AnimatorBean animatorBean) {LogUtil.d(TAG, "fadeAnim  [reason]:" + reason + " [isIn]:" + isIn);if (isIn) {fadeIn(animatorBean);} else {fadeOut(animatorBean);}}/*** 新播放操作需要取消延时操作,同时只允许一个运行* @param reason cancel for what*/private void fadeAnimCancel(String reason) {if (animfadeOut.isRunning() || animfadeIn.isRunning()) {animfadeOut.cancel();animfadeIn.cancel();LogUtil.d(TAG, "fadeAnimCancel:" + reason);}}private void fadeIn(AnimatorBean animatorBean) {fadeAnimCancel("fadeIn");animfadeIn.setDuration(DURATION_IN);animfadeIn.setInterpolator(new AccelerateInterpolator());animfadeIn.addUpdateListener(animation -> {float currentValue = (float) animation.getAnimatedValue();Log.d(TAG, "mPlayer.getVolume() value is " + mPlayer.getVolume());Log.d(TAG, "fadeIn value is " + currentValue + "  " + animation.isRunning());mPlayer.setVolume(currentValue);if (currentValue == 1.0f) {if (animatorBean != null && !animatorBean.isSend) {Log.d(TAG, "fadeIn value is isSuccess");animatorBean.isSend = true;animatorBean.impl.isSuccess(true);}}});animfadeIn.start();}private void fadeOut(AnimatorBean animatorBean) {fadeAnimCancel("fadeOut");animfadeOut.setDuration(DURATION_OUT);animfadeOut.setInterpolator(new DecelerateInterpolator());animfadeOut.addUpdateListener(animation -> {float currentValue = (float) animation.getAnimatedValue();Log.d(TAG, "mPlayer.getVolume() value is " + mPlayer.getVolume());Log.d(TAG, "fadeOut value is " + currentValue + "  " + animation.isRunning());mPlayer.setVolume(currentValue);if (currentValue == 0.0f) {if (animatorBean != null && !animatorBean.isSend) {Log.d(TAG, "fadeOut value is isSuccess");animatorBean.isSend = true;animatorBean.impl.isSuccess(true);}}});animfadeOut.start();}public interface AnimatorImpl {void isSuccess(boolean success);}public class AnimatorBean {public AnimatorImpl impl;public boolean isSend;public AnimatorBean(AnimatorImpl impl) {this.impl = impl;}}

播放器实现声音效果淡入淡出相关推荐

  1. 怎么快速调节EDIUS中声音的淡入淡出?

    使用EDIUS制作视频声音的淡入淡出是比较常见的一种视频剪辑形式,本文小编就给大家讲解如何做EDIUS视频声音淡入淡出. 1.将素材拖到合适位置的时间线轨道上,打开声音的波形显示开关,如下图中红框显示 ...

  2. Android 自定义控件 仿MX 播放器的SeekBar效果

    一.分析 最近下载了个MX 播放器来看视频,发现他的SeekBar做的挺有趣的,先看看MX 播放器的SeekBar效果: 外面多了个框框,没有了进度的那个小圆点,还可以以水平方向的摆放和竖直方向的摆放 ...

  3. HTML5播放器调用(功能效果)

     播放器调用 <div id="player"></div> <script src="//player.polyv.net/script/ ...

  4. 2021-07-11 远程连接电脑后,插入耳机听不到远程电脑上播放器的声音

    可以尝试的解决方法一 首先检查主机而不是直接对远程电脑的进行有关声音的设置 因为如果之前你远程连接电脑,而插入耳机都是能正常听到声音的.就当下你再插入耳机时听不到声音,那大概率是你把主机的声音调成静音 ...

  5. jQuery 效果 – 淡入淡出

    在jQuery中可以通过四个方法来实现元素的淡入淡出,这四个方法分别是:fadeIn().fadeOut().fadeToggle() 以及 fadeTo(),本文通过实例来为你讲解如何在jQuery ...

  6. jQuery学习教程五:jQuery 效果 - 淡入淡出, Fading 方法

    实例 jQuery fadeIn() 演示 jQuery fadeIn() 方法. <!DOCTYPE html> <html> <head> <script ...

  7. 基本动画效果(点赞,长按抖动,播放器转盘,水滴效果)

    定义属性 - (IBAction)trainsformAction:(id)sender;@property(nonatomic,retain)UIImageView *imageView; @pro ...

  8. iOS实现基于VLC播放器的封装效果

    前言: 在一些特定场景下,我们获取到的音视频,由于格式比较特殊,用avplayer等播放器是无法播放的,此时,我们可以借助强大的VLC播放器来处理. 原理这里不再赘述,下面我们讲一下如何添加VLC播放 ...

  9. 系统无声音,播放器有声音

    引用:http://www.8844.com/default.php?mod=ask_detail&tid=136005 确定若声卡.声卡驱动全无问题(只是开机.关机没声音,播放flash没有 ...

最新文章

  1. Zend Optimizer 相关报错收集
  2. AbstractQueuedSynchronizer理解之三(Semaphore)
  3. 云计算设计模式(三)——补偿交易模式
  4. USACO2.2【统计,dp,模拟,位运算】
  5. 怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言
  6. C++ 通讯录设计(四)
  7. 组策略系列之四:《精典放送:组策略管理20点》
  8. 干货分享|安全测试起航之旅 1
  9. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)
  10. vnpy2.0安装后报错ModuleNotFoundError: No module named 'vnpy.api.ctp.vnctpmd'
  11. 全球餐厅库存管理软件行业调研及趋势分析报告
  12. Camera:双目成像原理
  13. 卸载office2010后 再安装2013 错误1706 安装程序找不到需要的文件
  14. 【产品经理】产品经理进阶之路(六):互联网思维详解
  15. flyme6 patchrom插桩从入门到放弃
  16. 32位的md5校验程序
  17. Java基础-程序基础
  18. c语言 写播放器,C语言实现Mini-Cooledit音频播放器(13页)-原创力文档
  19. Java中的equals()方法
  20. 大仗的打法——推荐《智能商业》曾鸣的战略格局

热门文章

  1. 智能手表的未来:独立还是附属,这是个问题!
  2. shell中sed命令用法
  3. 一篇面经(BAT面试)(转)
  4. VScode 配置 Java 开发环境(最简单的纯小白带图版)
  5. Linux解压文件到指定目录
  6. pymysql的列名传参
  7. lru算法实现 redis_Redis中的lru算法实现
  8. python中布隆过滤器用法详解
  9. android 学习之ExpandableListView
  10. Qt安卓开发经验021-030