首先我在这里讲一下我的整个播放器的思路:
首先是一个歌曲的列表,我把数据请求放在了一个单例里面,方便以后获取每首歌曲对应的model, 我给AVPlayer的播放也放在了一个单例里面,有播放开始,停止,等方法吗,我通过单例的代理方法将当前的播放时间传给播放时的控制器,这样控制器就可以根据传过去的当前时间给界面赋值了,比如播放界面的当前时间,以及当前的歌词等.

实现播放模式的思路:
1.通过点击按钮 弹出来一个下弹窗 可以选择播放模式 声明一个全局变量 不同的点击全局变量的值改变 全局变量默认的播放模式是列表循环
2.播放音乐时给播放添加计时器每隔0/1秒就要响应一次 通过代理方法传给控制器当前播放时间
3.在控制器的代理方法中 根据传过来的时间与当前歌曲的总时间对比,如果相等说明这首歌结束了,就调用歌曲结束的方法.
4.在音乐播放完毕的时候调用方法 根据不同的全局变量 实现不同的操作

第一步 实现button的点击方法 通过点击不同的下弹窗的值改变全局变量,记录选择的模式

/ 模式typeButton的点击方法的实现
- (void)actionTypeButton:(UIButton *)typeButton {UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请选择模式" message:nil preferredStyle:(UIAlertControllerStyleActionSheet)];// 添加顺序播放按钮UIAlertAction *serialAction = [UIAlertAction actionWithTitle:@"顺序播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {// 给定义的全局变量赋值self.typeCount = 0;}];// 添加随机播放按钮UIAlertAction *ArcAction = [UIAlertAction actionWithTitle:@"随机播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {self.typeCount = 1;}];// 添加重复播放按钮UIAlertAction *repeatAction = [UIAlertAction actionWithTitle:@"重复播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {self.typeCount = 2;}];[alertController addAction:serialAction];[alertController addAction:ArcAction];[alertController addAction:repeatAction];[self presentViewController:alertController animated:YES completion:nil];
}

第二步:给播放添加计时器每隔0/1秒就要响应一次 通过代理方法传给控制器当前播放时间

// 开始播放
- (void)musicPlay {self.isPlaying = YES; // 当前的播放状态[self.player play]; // AVPlayer开始播放self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playingAction) userInfo:nil repeats:YES]; // 开始计时器 调用播放的响应方法
}#pragma mark -播放过程中执行
- (void)playingAction {// 取到当前播放时间的秒数CGFloat time = self.player.currentTime.value / self.player.currentTime.timescale;// 代理方法 将获取到的时间 传递到控制器if (self.delegate && [self.delegate performSelector:@selector(playingWithProgress:)]) {[_delegate playingWithProgress:time];}}

第三步:在控制器的代理方法中 根据传过来的时间与当前歌曲的总时间对比,如果相等说明这首歌结束了,就调用歌曲结束的方法.

#pragma mark -- 实现代理方法
- (void)playingWithProgress:(CGFloat)progress {// progress 当前歌曲播放到的时间// self.model.duration 当前歌曲的总时间NSInteger second = self.model.duration / 1000;if (progress == second) {[self musicEnd];}}

第四步:得到歌曲的进度的值 当播放完毕的时候 做不同的操作

#pragma mark --音乐结束后 不同模式下的反应--
- (void)musicEnd {
// progress 当前歌曲播放到的时间// self.model.duration 当前歌曲的总时间NSInteger second = self.model.duration / 1000;if (progress == second) {switch (self.typeCount) {case 0:{// 当选择列表循环时候的操作// actionDownButton: 下面有方法的实现[self performSelector:@selector(actionDownButton:) withObject:nil];break;}case 1:{// 当选择随机播放是的操作NSInteger num = [[RootTableViewManager shareManager] getDataArrayCount];self.index = arc4random() % (num + 1);// 更改了index 就相当于改变了model 更改了数据  所以要刷新界面[self Valuation]; // 该方法是更改界面 给AVPlayer更换playerItem(就是穿进去新的MP3的url) 播放音乐break;}case 2:{// 当选择循环播放时的操作 只要更改界面就可以了[self Valuation];break;}default:break;}}}

// actionDownButton:方法的实现

// 下一首的实现方法
- (void)actionDownButton:(UIButton *)downButton {self.index ++;NSInteger num = [[RootTableViewManager shareManager] getDataArrayCount];// 当时最后一首的时候 跳到最前面if (self.index > num) {self.index = 0;}[self Valuation];}

// 界面的赋值是根据model的 线面是model的实现

/ 重写model的get方法
- (Model *)model {// 根据当前的index 选中对应index歌曲的model 成为当前播放的数据源odel *model =  [[RootTableViewManager shareManager] getModelAtIndex:self.index];return model;
}

iOS AVPlayer播放模式的实现(随机播放 列表循环 单曲循环)相关推荐

  1. 【小河今学 | JavaScript + JQuery】音乐播放器4-音量调整、单曲循环、全部循环

    08.18今天来完善音乐播放器的音量调整.单曲循环和全部循环功能. 本篇基于上一篇[小河今学 | JavaScript + JQuery]音乐播放器3-歌词轮播和进度条跳转功能实现 一.音量调整 首先 ...

  2. 音乐播放器的实现(四)—— 歌曲列表、顺序播放、单曲循环、随机播放、自动下一曲

    音乐播放器的实现(四)-- 歌曲列表.顺序播放.单曲循环.随机播放.自动下一曲 传送门:(完整工程见第五章篇尾) 音乐播放器的实现(一)-- Audio Listener和Audio Source面板 ...

  3. 原生H5+JS+CSS实现音乐播放器(上下一首,随机单曲循环播放,进度条,播放列表)

    学了前端小半个月了,今天自己动手写一个音乐播放器实现的功能有 播放列表 ,随机单曲循环播放,上下一首,暂停和开始,静音,音量增加减少,进度条(收藏功能暂未实现,为了排版好看添加的,后续补充收藏等功能) ...

  4. android音乐播放器 单曲循环,[Android] MediaPlayer单曲循环不卡顿

    [TOC] 0x00 需求 单曲循环播放歌曲,要求过度连贯,听不出来卡顿感觉. 0x01 解决思路 MediaPlayer 对于常见的音乐播放,我们第一时间想到的应该就是它,它有一个方法 MediaP ...

  5. 苹果播放器实现单曲循环

    一直觉得苹果的音乐播放器比较坑. 但是,用了qq音乐播放器,发现,我竟然没法把电脑里的音乐导入到手机里.更坑. 必须重用苹果的音乐播放器.下简称MP(music player). 因为学英语,必须要单 ...

  6. 微信小程序自定义音频组件,自定义滚动条,单曲循环,循环播放

    小程序自定义音频组件,带滚动条 摘要:首先自定义音频组件,是因为产品有这样的需求,需要如下样式的 而微信小程序API给我们提供的就是这样的 而且产品需要小程序有后台播放功能,所以我们不考虑小程序的 a ...

  7. python单曲循环播放MP3

    python单曲循环播放mp3 本文使用pygame播放MP3 1.安装pygame包 安装方式请查看https://blog.csdn.net/python_go/article/details/1 ...

  8. 原生js实现播放器操作(随机播放、上/下一首、播放/暂停)

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  9. android 随机播放代码,Android | 一个随机播放网络音乐的小 Demo

    前言 是这样,前几天接触到一个可以随机获取网络音乐及其热评的 API(关于该API:github.com/isecret/yun- ),于是乎就想着要做一个小 demo 来练练手吧! 目前的效果就是上 ...

  10. 在java中图片随机播放_java-以相同顺序随机播放多个文件

    接下来仅使用基本的bash命令.原则是: >生成随机顺序(数字) >按此顺序订购所有文件 编码 #!/bin/bash case "$#" in 0) echo &qu ...

最新文章

  1. 甘肃黄土山地数十载现“满眼绿” 护林员四季不歇护植被
  2. linux桥接实现交换机功能
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1082:求小数的某一位
  4. 从编解码、传输到基础架构 详解Bigo多媒体技术栈
  5. android语言列表+波斯,Android 多语言入门及实战
  6. wordpress胖鼠采集去限制版
  7. Win7下的内置FTP组件的设置详解
  8. shell 中的export作用(转载)
  9. 栈和队列8 - 数据结构和算法30
  10. 记一次升级node版本后,运行原vue项目报错问题解决方法
  11. 面试题--------3、string stringbuffer stringbuilder的区别
  12. java统计文本中英文单词个数split_Java实现单词统计
  13. bos平台 Java_Bos平台修改发布业务单元的jdk版本
  14. Vue3中Compositions API的使用(一)
  15. C++编写任意次clampedB样条曲线(曲线分别与第一个控制点和最后一个控制点的第一边和最后一边相切)
  16. 数据分析综述:一文带你详细了解自动驾驶技术
  17. 计算机考研要考科目,2022考研:计算机专业需要准备哪些科目?
  18. 5款便捷的App帮你预定出租车
  19. 算法养成:弱鸡大学生浅谈c++stl
  20. AutoCAD中程序创建Ribbon界面执行AutoCAD命令

热门文章

  1. 008/160 CrackMe Andrénalin #1
  2. qimage加载jpg失败_QImage基本api
  3. 【人脸姿态】2D人脸姿态估计的两种方式:solvePnP与3DMM参数
  4. 下载《阿里巴巴Java开发手册(详尽版)1.4.0》 与 码出高效,码出质量
  5. 使用linux批量引物设计,使用SSRMMD便捷、迅速与准确地进行:SSR位点检测,多态性SSR筛选,与批量SSR引物设计...
  6. kuangbin线段树专题
  7. iOS手势识别的工作原理
  8. 1小时场景生活圈来了!苏宁双十一引领零售体验革命
  9. linux抓包操作,linux/windows常用抓包分析操作
  10. 【存储】AIX存储管理基本概念和操作(LVM)