播放器实现声音效果淡入淡出
目录
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;}}
播放器实现声音效果淡入淡出相关推荐
- 怎么快速调节EDIUS中声音的淡入淡出?
使用EDIUS制作视频声音的淡入淡出是比较常见的一种视频剪辑形式,本文小编就给大家讲解如何做EDIUS视频声音淡入淡出. 1.将素材拖到合适位置的时间线轨道上,打开声音的波形显示开关,如下图中红框显示 ...
- Android 自定义控件 仿MX 播放器的SeekBar效果
一.分析 最近下载了个MX 播放器来看视频,发现他的SeekBar做的挺有趣的,先看看MX 播放器的SeekBar效果: 外面多了个框框,没有了进度的那个小圆点,还可以以水平方向的摆放和竖直方向的摆放 ...
- HTML5播放器调用(功能效果)
播放器调用 <div id="player"></div> <script src="//player.polyv.net/script/ ...
- 2021-07-11 远程连接电脑后,插入耳机听不到远程电脑上播放器的声音
可以尝试的解决方法一 首先检查主机而不是直接对远程电脑的进行有关声音的设置 因为如果之前你远程连接电脑,而插入耳机都是能正常听到声音的.就当下你再插入耳机时听不到声音,那大概率是你把主机的声音调成静音 ...
- jQuery 效果 – 淡入淡出
在jQuery中可以通过四个方法来实现元素的淡入淡出,这四个方法分别是:fadeIn().fadeOut().fadeToggle() 以及 fadeTo(),本文通过实例来为你讲解如何在jQuery ...
- jQuery学习教程五:jQuery 效果 - 淡入淡出, Fading 方法
实例 jQuery fadeIn() 演示 jQuery fadeIn() 方法. <!DOCTYPE html> <html> <head> <script ...
- 基本动画效果(点赞,长按抖动,播放器转盘,水滴效果)
定义属性 - (IBAction)trainsformAction:(id)sender;@property(nonatomic,retain)UIImageView *imageView; @pro ...
- iOS实现基于VLC播放器的封装效果
前言: 在一些特定场景下,我们获取到的音视频,由于格式比较特殊,用avplayer等播放器是无法播放的,此时,我们可以借助强大的VLC播放器来处理. 原理这里不再赘述,下面我们讲一下如何添加VLC播放 ...
- 系统无声音,播放器有声音
引用:http://www.8844.com/default.php?mod=ask_detail&tid=136005 确定若声卡.声卡驱动全无问题(只是开机.关机没声音,播放flash没有 ...
最新文章
- Zend Optimizer 相关报错收集
- AbstractQueuedSynchronizer理解之三(Semaphore)
- 云计算设计模式(三)——补偿交易模式
- USACO2.2【统计,dp,模拟,位运算】
- 怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言
- C++ 通讯录设计(四)
- 组策略系列之四:《精典放送:组策略管理20点》
- 干货分享|安全测试起航之旅 1
- LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)
- vnpy2.0安装后报错ModuleNotFoundError: No module named 'vnpy.api.ctp.vnctpmd'
- 全球餐厅库存管理软件行业调研及趋势分析报告
- Camera:双目成像原理
- 卸载office2010后 再安装2013 错误1706 安装程序找不到需要的文件
- 【产品经理】产品经理进阶之路(六):互联网思维详解
- flyme6 patchrom插桩从入门到放弃
- 32位的md5校验程序
- Java基础-程序基础
- c语言 写播放器,C语言实现Mini-Cooledit音频播放器(13页)-原创力文档
- Java中的equals()方法
- 大仗的打法——推荐《智能商业》曾鸣的战略格局