美文网首页OC开发iOS技术点
iOS播放音乐,音量淡出暂停效果

iOS播放音乐,音量淡出暂停效果

作者: ziooooo | 来源:发表于2016-04-01 09:33 被阅读895次

在开发过程中,使用到了音频的播放AVAudioPlayer,其中的-(void)pause;暂停播放的方法暂停时过于生硬。于是我试着暂停时使音量逐渐降低,达到淡出的效果。

音量、逐渐、降低,看这几个词我决定使用一个定时器修改AVAudioPlayer实例的volume属性直到值为0,来实现这个效果。


首先为AVAudioPlayer创建一个分类

@interface AVAudioPlayer (Category)

-(void)graduallyPasue;

@end

下面按照之前的想法来简单实现以下音量逐渐降低,在.m文件中

-(void)graduallyPasue
{
    //用GCD创建一个计时器
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    //0.1秒执行一次
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 0.1 * NSEC_PER_SEC, 0);
    dispatch_source_set_event_handler(_timer, ^{
        //每次音量 -0.1
        self.volume -= 0.1;
        if (self.volume < 0) {//音量小于0时结束定时器
            dispatch_source_cancel(_timer);
        }
    });
    dispatch_source_set_cancel_handler(_timer, ^{
        //结束时,暂停
        [self pause];
    });
    dispatch_resume(_timer);
}

上面的代码中,如果原来的音量是1.0,那么就需要1s的时间来暂停音乐,暂时先这么写,以后再做优化。

接下来试一试-(void)graduallyPasue的效果,我的使用场景是暂停一首音乐,继续播放下一首音乐。这时问题出现了:

  • 如果是用的是同一个AVAudioPlayer实例来播放音乐的话,第一首音乐并没有声音淡出的效果,并且第二首音乐声音逐渐变小直到暂停。
  • 如果不是同一个AVAudioPlayer实例来播放音乐的话,第二首音乐会在第一首音乐没有暂停时就开始播放。

造成这种问题的原因就是播放第二首音乐的代码,在第一首暂停方法未执行完毕的时候就开始执行了。那么我们使用GCD提供的dipatch group来保持队列同步,使计时器结束后再执行后面的代码。

-(void)graduallyPasue
{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    
    //用GCD创建一个计时器
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    //0.1秒执行一次
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 0.1 * NSEC_PER_SEC, 0);
    dispatch_source_set_event_handler(_timer, ^{
        //每次音量 -0.1
        self.volume -= 0.1;
        if (self.volume < 0) {//音量小于0时结束定时器
            dispatch_source_cancel(_timer);
        }
    });
    dispatch_source_set_cancel_handler(_timer, ^{
        //结束时,暂停
        [self pause];
        
        dispatch_group_leave(group);
    });
    dispatch_resume(_timer);
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}

这样用起来就好多了,那么再优化一下,可以控制暂停时淡出的时间。

-(void)graduallyPasueWithDuration:(NSTimeInterval)duration
{
    //频率
    static NSTimeInterval frequency = 0.05;
    //定时器执行次数
    __block int overCount = duration / frequency;
    //声音每次降低的偏移量
    float volumeOffset = self.volume / overCount;
    
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), frequency * NSEC_PER_SEC, 0);
    dispatch_source_set_event_handler(_timer, ^{
        overCount -= 1;
        self.volume -= volumeOffset;
        if (overCount < 0) {
            dispatch_source_cancel(_timer);
        }
    });
    dispatch_source_set_cancel_handler(_timer, ^{
        [self pause];
        dispatch_group_leave(group);
    });
    dispatch_resume(_timer);
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}

修改一下.h的方法名,就可以使用了。


第一次发文章,热爱技术的大家,欢迎交流啊!

相关文章

  • iOS播放音乐,音量淡出暂停效果

    在开发过程中,使用到了音频的播放AVAudioPlayer,其中的-(void)pause;暂停播放的方法暂停时过...

  • H5视频兼容安卓、IOS踩坑相关

    1.视频暂停和播放 将JQ对象转换为原生JS对象 有遮罩层的视频播放和暂停 2.音乐开关 3.视频切换+音量播放 ...

  • 微信下的video标签

    统一播放效果 iOS 在 iOS 上,播放视频默认会弹出一个播放器全屏播放视频,可以控制视频的播放进度、音量以及暂...

  • CSS3 swiper框架(三)

    一.旋转的音乐图标 htmlcss 二.背景音乐效果的控制 点击音乐图标,音乐暂停播放,图标暂停旋转;再次点击,再...

  • 基于IJKPlayer框架的 iOS视频播放器

    这是一个基于ijkplayer框架的iOS视频播放器,包含全屏、播放、暂停、亮度调节、音量调节、进度条(边播边缓存...

  • IOS关于音乐播放器

    1.搭建音乐播放器的界面 对于这个音乐播放器我只实现了播放 暂停 下一曲 上一曲 停止 音量加减 和从歌曲列表中选...

  • 音乐播放器

    1.搭建音乐播放器的界面对于这个音乐播放器我只实现了播放 暂停 下一曲 上一曲 停止 音量加减 和从歌曲列表...

  • video适配android和ios全屏显示设置的属性

    效果要求 :按住按钮视频全屏播放,松开暂停; iOS; 效果预览 android Android上不能像苹果一样在...

  • 音视频

    音效 1.iOS中音乐可以暂停,音效不能操作;而且音效可以立即播放,加载到本地,而音乐需要缓冲,边下边播.在iOS...

  • iOS系统音量键设置

    期望效果,系统音量键的关闭不影响视频播放音量控制。

网友评论

    本文标题:iOS播放音乐,音量淡出暂停效果

    本文链接:https://www.haomeiwen.com/subject/kfnelttx.html