AVPlayer 可以实现音频或者视频文件的在线播放和本地播放。最近做了一个单曲循环播放的功能。一开始选择了下面这个方法:

- (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item;

但尝试后发现两首音乐无法完美衔接,中间会有一个短暂的停留,这个不太符合我们的需求。尝试在播放完后,重新创建播放器,继续播放这首音乐。但还是会有停留。

随后采用了一个折中的方案,在音乐播放即将完成的时候,重新创建一个新的播放器,开始播放。第一个播放器播放完成后就销毁掉。当第二个播放器即将播放完成的时候,在初始化第一个播放器,记录开始播放,以此循环。这样,用一段重合的音乐代替了一段暂停。

我们需要监听音乐播放:

id _timeObserve;
id _timeLoopObserve;

监听第一个播放器的播放情况:

@weakify(self)_timeObserve = [self.musicPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {@strongify(self)float current = CMTimeGetSeconds(time);float total = CMTimeGetSeconds(self.currentPlayerItem.duration);//即将播放完成后,继续播放该音乐if (current >= total-5 && current < total && !self.musicPlayerSwitch) {self.musicPlayer.volume = 0.8;[self resetMusicLoopPlayer];[self initMusicLoopPlayer];self.musicLoopPlayer.volume = 0.8;[self.musicLoopPlayer play];self.musicPlayerSwitch = YES;}}else{if (current > 6 && current < total-6) {self.musicPlayerSwitch = NO;[self resetMusicPlayer];self.musicLoopPlayer.volume = 1;}}}];

监听第二个播放器的播放情况:

@weakify(self)_timeLoopObserve = [self.musicLoopPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {@strongify(self)float current = CMTimeGetSeconds(time);float total = CMTimeGetSeconds(self.currentPlayerItem.duration);//即将播放完成后,继续播放该音乐if (current >= total-5 && current < total && !self.musicPlayerSwitch) {self.musicPlayer.volume = 0.8;[self resetMusicPlayer];[self initMusicPlayer];self.musicPlayer.volume = 0.8;[self.musicPlayer play];self.musicPlayerSwitch = YES;}}else{if (current > 6 && current < total-6) {self.musicPlayerSwitch = NO;[self resetMusicLoopPlayer];self.musicPlayer.volume = 1;}}}];

如上代码,在两段音乐重叠的时候,为了防止声音突然变大,通过设置 volume 降低声音。在其中一个播放器销毁的时候再恢复原声。

另外,销毁播放器的时候注意要把观察者移除:

- (void)resetMusicPlayer{if (self.musicPlayer) {[self.musicPlayer removeTimeObserver:_timeObserve];_timeObserve = nil;}self.musicPlayer  = nil;
}
- (void)resetMusicLoopPlayer{if (self.musicLoopPlayer) {[self.musicLoopPlayer removeTimeObserver:_timeLoopObserve];_timeLoopObserve = nil;}self.musicLoopPlayer  = nil;
}

AVPlayer 无间隔循环播放相关推荐

  1. 【杰理AC692X】关于外挂FLASH音频无间断循环播放

    SDK:extern_flash_V2.5.1 这里说的无间断播放,比如说下面的音频信号: 要求是循环播放的时候不能有停顿 按照<AC692x系列提示音无间断循环播放>中的描述,把flas ...

  2. html5 无插件视频播放器,多功能流媒体播放器网页无插件直播EasyPlayer.js如何实现播放完自动循环播放...

    原标题:多功能流媒体播放器网页无插件直播EasyPlayer.js如何实现播放完自动循环播放 EasyPlayer-Android播放器是一款可针对RTSP.RTMP.RTSP&RTMP协议进 ...

  3. iOS 视频播放 AVPlayer 循环播放 闪屏

    问题终于解决,选用AVPlayer,重置一下AVPlayerItem就不会出现闪屏现象,注册一个通知同样可以实现循环播放,而且AVPlayer可以自定义播放样式,给了我们更大的发挥空间,完全可以自己D ...

  4. 多功能流媒体播放器实现网页无插件直播之EasyPlayer.js如何实现播放完自动循环播放

    EasyPlayer-Android播放器是一款可针对RTSP.RTMP.RTSP&RTMP协议进行过优化的流媒体播放器,其中我们引以为傲的两个技术优势就是起播速度快和播放延迟低.最近我们遇到 ...

  5. 多图片每隔2S循环播放

    这算是自己的第一篇博文吧,记录下关于web的学习路程,虽然在别人眼里平淡无奇,不过我能力有限,一步步慢慢来-- 因为自己的疏忽与大意,急于把自己的代码精简,却没有去测试是否实现了代码原来的功能,造成之 ...

  6. webview加载本地html_安卓webview html5 自动播放本地视频,网上视频,可以循环播放...

    我们做安卓开发时,webview中发现html5 视频的autoplay根本没实现,查看了下android 源码HTMLVideoElement.cpp也未见相应处理,网上有资料显示,这可能关乎UI线 ...

  7. Python 实现图片轮播及音乐循环播放

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/enland_lan/article/d ...

  8. vb 循环放音乐_为何洒水车一直无限循环播放《兰花草》这首歌呢?

    展开全部 在城市中,洒水车2113可谓是一道亮丽的风景.5261洒水车的作用4102实在是太多了,首先可以用来清洁道路,1653然后可以给道路上的花花草草以及高大的树木浇水.到了夏天的时候洒水车还肩负 ...

  9. Python OpenCV _1基本操作(画图,循环播放图像,鼠标事件,读取中文路径中的图片)

    此系列源码在我的GitHub里:https://github.com/yeyujujishou19/Python-OpenCV 一,OpenCV的结构 A)根据功能和需求的不同,OpenCV中的函数接 ...

最新文章

  1. SAP SD基础知识之装运的组织单元(Organizational Units in Shipping)
  2. 使用 flex 实现 5 种常用布局
  3. 数据库的两种引擎Innodb和MyIASM
  4. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
  5. 分库分表的几种常见形式以及可能遇到的难
  6. 在Windows 7中搭建Wordpress环境
  7. C语言数据结构各种结构体的定义
  8. uniapp开发App调用微信授权登陆
  9. abap中方法file_open_dialog的使用
  10. php包含那点事情[WOOYUN]
  11. SQL连接MYSQL出现对象名无效_SQL数据库时提示对象名'XXX' 无效
  12. 学习高效编程之 Vim 方法
  13. 编写一个程序,提示用户输入一个四位整数(例如:1234),然后显示输入数的相反排序(例如:4321)并计算该数字中每个数字的总和(总和=4+3+2+1)。
  14. SDUT最短路径问题 1867————最短路
  15. ASCII编码以及转换
  16. C#(十三)之字符串string
  17. 2022最新微信步数提交平台网站PHP源码
  18. halting problem 详解
  19. 可以练计算机应用基础的网址,计算机应用基础模拟练习题
  20. 土地利用覆被变化的概念_土地利用土地覆被变化研究概述

热门文章

  1. 比空间池化更好的条带池化方法
  2. CCF201703-1之分蛋糕
  3. 聊城大学计算机科学系,聊城大学计算机学院介绍
  4. 利用卫星数据绘制热脆弱性图—利用遥感监测城市热量
  5. 奶牛专题1:圆圈舞蹈
  6. JavaScript学习笔记——DOM
  7. 海报教程,制作楚乔传火焰海报
  8. linux date输出时分秒,linux的date命令
  9. ⑦ 【自监督 · 文献精读】动作识别 | 时空对比学习 | 动作编码 | GCN | 对比性代理任务 | 对比学习 | 三维动作识别 | 编码 | 特征提取
  10. HashMap面试底层原理(原作者很厉害)