DFPlayer.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. //
  2. // DFPlayer.h
  3. // DFPlayer
  4. //
  5. // Created by ihoudf on 2017/7/18.
  6. // Copyright © 2017年 ihoudf. All rights reserved.
  7. //
  8. //
  9. // DFPlayer当前版本:2.0.3
  10. //
  11. #import <Foundation/Foundation.h>
  12. #import <AVFoundation/AVFoundation.h>
  13. #import "DFPlayerModel.h"
  14. #import "DFPlayerUIManager.h"
  15. #import "NASFileAudioModel.h"
  16. //播放器状态
  17. typedef NS_ENUM(NSInteger, DFPlayerState) {
  18. DFPlayerStateFailed, // 播放失败
  19. DFPlayerStateBuffering, // 缓冲中
  20. DFPlayerStatePlaying, // 播放中
  21. DFPlayerStatePause, // 暂停播放
  22. DFPlayerStateStopped // 停止播放
  23. };
  24. //播放模式
  25. typedef NS_ENUM(NSInteger, DFPlayerMode){
  26. DFPlayerModeOnlyOnce, //单曲只播放一次,默认
  27. DFPlayerModeSingleCycle, //单曲循环
  28. DFPlayerModeOrderCycle, //顺序循环
  29. DFPlayerModeShuffleCycle //随机循环
  30. };
  31. //状态码
  32. typedef NS_ENUM(NSUInteger, DFPlayerStatusCode) {
  33. DFPlayerStatusNoNetwork = 2100, //未缓存的网络音频,点击播放时若无网络会返回该状态码。缓冲完成前若断网也会返回该状态码。(PS:DFPlayer支持运行时断点续传,即缓冲时网络从无到有,可以断点续传,而某音频没缓冲完就退出app,再进入app没做断点续传,以上特点与QQ音乐一致)
  34. DFPlayerStatusViaWWAN = 2101, //WWAN网络状态(注意:属性isObserveWWAN(默认NO)为YES时,对于未缓存的网络音频,点击该音频时开始缓冲时返回该状态码。而音频正在缓冲时,网络状态由wifi到wwan并不会返回该状态码,以上特点与QQ音乐一致)
  35. DFPlayerStatusTimeOut = 2200, //音频请求超时(根据服务器返回的状态码)
  36. DFPlayerStatusFailed = 2300, //音频无法播放(AVPlayerItemStatusFailed)
  37. DFPlayerStatusUnknown = 2301, //未知错误(AVPlayerItemStatusUnknown)
  38. DFPlayerStatusCacheFail = 2400, //当前音频缓存失败
  39. DFPlayerStatusCacheSucc = 2401 //当前音频缓存成功
  40. };
  41. @class DFPlayer;
  42. @protocol DFPlayerDataSource <NSObject>
  43. @required
  44. /**
  45. 数据源1:音频数组
  46. @param player DFPlayer
  47. */
  48. - (NSArray<DFPlayerModel *> *)df_audioDataForPlayer:(DFPlayer *)player;
  49. @optional
  50. /**
  51. 数据源2:音频信息
  52. 调用df_playWithAudioId时,DFPlayer会调用此方法请求当前音频的信息
  53. 根据player.currentAudioModel.audioId获取音频在数组中的位置,传入对应的音频信息model
  54. @param player DFPlayer
  55. */
  56. - (DFPlayerInfoModel *)df_audioInfoForPlayer:(DFPlayer *)player;
  57. @end
  58. @protocol DFPlayerDelegate <NSObject>
  59. @optional
  60. /**
  61. 代理1:音频已经加入播放队列
  62. @param player DFPlayer
  63. */
  64. - (void)df_playerAudioAddToPlayQueue:(DFPlayer *)player;
  65. /**
  66. 代理2:准备播放
  67. @param player DFPlayer
  68. */
  69. - (void)df_playerReadyToPlay:(DFPlayer *)player;
  70. /**
  71. 代理3:缓冲进度代理 (属性isObserveBufferProgress(默认YES)为YES时有效)
  72. @param player DFPlayer
  73. @param bufferProgress 缓冲进度
  74. */
  75. - (void)df_player:(DFPlayer *)player bufferProgress:(CGFloat)bufferProgress;
  76. /**
  77. 代理4:播放进度代理 (属性isObserveProgress(默认YES)为YES时有效)
  78. @param player DFPlayer
  79. @param progress 播放进度
  80. @param currentTime 当前播放到的时间
  81. */
  82. - (void)df_player:(DFPlayer *)player progress:(CGFloat)progress currentTime:(CGFloat)currentTime;
  83. /**
  84. 代理5:播放结束代理(默认播放结束后调用df_next。如果实现此代理,播放结束逻辑由您处理)
  85. @param player FPlayer
  86. */
  87. - (void)df_playerDidPlayToEndTime:(DFPlayer *)player;
  88. /**
  89. 代理6:播放状态码代理(统一在主线程返回)
  90. @param player DFPlayer
  91. @param statusCode 状态码
  92. */
  93. - (void)df_player:(DFPlayer *)player didGetStatusCode:(DFPlayerStatusCode)statusCode;
  94. /**
  95. 代理7:播放器被系统打断代理(默认被系统打断暂停播放,打断结束检测能够播放则恢复播放。如果实现此代理,打断逻辑由您处理)
  96. @param player DFPlayer
  97. @param isInterrupted YES:被系统打断开始 NO:被系统打断结束
  98. */
  99. - (void)df_player:(DFPlayer *)player isInterrupted:(BOOL)isInterrupted;
  100. /**
  101. 代理8:监听耳机插入拔出代理(默认拨出耳机暂停播放,插入耳机不恢复播放。如果实现此代理,耳机插拔逻辑由您处理)
  102. @param player DFPlayer
  103. @param isHeadphone YES:插入 NO:拔出
  104. */
  105. - (void)df_player:(DFPlayer *)player isHeadphone:(BOOL)isHeadphone;
  106. @end
  107. /**
  108. DFPlayer播放管理器
  109. */
  110. @interface DFPlayer : NSObject
  111. #pragma mark - 初始化和操作
  112. @property (nonatomic, weak) id<DFPlayerDataSource> dataSource;
  113. @property (nonatomic, weak) id<DFPlayerDelegate> delegate;
  114. /**
  115. 播放器类型,默认AVAudioSessionCategoryPlayback
  116. Tips:AVAudioSessionCategoryPlayback,需在工程里设置targets->capabilities->选择backgrounds modes->勾选audio,airplay,and picture in picture
  117. */
  118. @property (nonatomic, assign) AVAudioSessionCategory category;
  119. /**
  120. 播放模式,默认DFPlayerModeOnlyOnce。
  121. */
  122. @property (nonatomic, assign) DFPlayerMode playMode;
  123. /**
  124. 是否监听播放进度,默认YES
  125. */
  126. @property (nonatomic, assign) BOOL isObserveProgress;
  127. /**
  128. 是否监听缓冲进度,默认YES
  129. */
  130. @property (nonatomic, assign) BOOL isObserveBufferProgress;
  131. /**
  132. 是否需要缓存,默认YES
  133. */
  134. @property (nonatomic, assign) BOOL isNeedCache;
  135. /**
  136. 是否监测WWAN无线广域网(2g/3g/4g),默认NO。
  137. 播放本地音频(工程目录和沙盒文件)不监测。
  138. 播放网络音频时,DFPlayer为您实现无网络有缓存播放缓存,无网络无缓存返回无网络错误码,wifi下自动播放。开启该属性,当网络为WWAN时,通过代理6返回状态码DFPlayerStatusViaWWAN。
  139. */
  140. @property (nonatomic, assign) BOOL isObserveWWAN;
  141. /**
  142. 是否监听服务器文件修改时间,默认NO。
  143. 第一次请求某资源时,DFPlayer缓存文件的同时会记录文件在服务器端的修改时间。
  144. 开启该属性,以后播放该资源时,DFPlayer会判断服务端文件是否修改过,修改过则加载新资源,没有修改过则播放缓存文件。
  145. 关闭此属性,有缓存时将直接播放缓存,不做更新校验,在弱网环境下播放响应速度更快。
  146. 无网络连接时,有缓存直接播放缓存文件。
  147. */
  148. @property (nonatomic, assign) BOOL isObserveFileModifiedTime;
  149. /** model数据数组 */
  150. @property (nonatomic, strong) NSMutableArray<DFPlayerModel *> *playerModelArray;
  151. /**
  152. 单例
  153. */
  154. + (DFPlayer *)sharedPlayer;
  155. /**
  156. 初始化播放器
  157. @param userId 用户Id。
  158. isNeedCache(默认YES)为YES时,若同一设备登录不同账号:
  159. 1.userId不为空时,DFPlayer将为每位用户建立不同的缓存文件目录。例如,user_001,user_002...
  160. 2.userId为nil或@""时,统一使用DFPlayerCache文件夹下的user_public作为缓存目录。
  161. isNeedCache为NO时,userId设置无效,此时不会在沙盒创建缓存目录。
  162. */
  163. - (void)df_initPlayerWithUserId:(NSString *)userId;
  164. /**
  165. 刷新数据源数据
  166. */
  167. - (void)df_reloadData;
  168. /**
  169. 选择audioId对应的音频开始播放。
  170. 说明:DFPlayer通过数据源方法提前获取数据,通过df_playWithAudioId选择对应音频播放。
  171. 而在删除、增加音频后需要调用[[DFPlayer shareInstance] df_reloadData];刷新数据。
  172. */
  173. - (void)df_playWithAudioId:(NSUInteger)audioId;
  174. /**
  175. 播放
  176. */
  177. - (void)df_play;
  178. /**
  179. 暂停
  180. */
  181. - (void)df_pause;
  182. /**
  183. 下一首
  184. */
  185. - (void)df_next;
  186. /**
  187. 上一首
  188. */
  189. - (void)df_last;
  190. /**
  191. 音频跳转
  192. @param value 时间百分比(要跳转到的时间/总时间)
  193. @param completionBlock seek结束
  194. */
  195. - (void)df_seekToTime:(CGFloat)value completionBlock:(void(^)(void))completionBlock;
  196. /**
  197. 倍速播放(iOS10之后系统支持的倍速常数有0.50, 0.67, 0.80, 1.0, 1.25, 1.50和2.0)
  198. @param rate 倍速
  199. */
  200. - (void)df_setRate:(CGFloat)rate;
  201. /**
  202. 释放播放器,还原其他播放器
  203. */
  204. - (void)df_deallocPlayer;
  205. #pragma mark - 状态类
  206. /**
  207. 播放器状态
  208. */
  209. @property (nonatomic, readonly, assign) DFPlayerState state;
  210. /**
  211. 当前正在播放的音频model
  212. */
  213. @property (nonatomic, readonly, strong) DFPlayerModel *currentAudioModel;
  214. /**
  215. 当前正在播放的音频信息model
  216. */
  217. @property (nonatomic, readonly, strong) DFPlayerInfoModel *currentAudioInfoModel;
  218. /**
  219. 当前音频缓冲进度
  220. */
  221. @property (nonatomic, readonly, assign) CGFloat bufferProgress;
  222. /**
  223. 当前音频播放进度
  224. */
  225. @property (nonatomic, readonly, assign) CGFloat progress;
  226. /**
  227. 当前音频当前时间
  228. */
  229. @property (nonatomic, readonly, assign) CGFloat currentTime;
  230. /**
  231. 当前音频总时长
  232. */
  233. @property (nonatomic, readonly, assign) CGFloat totalTime;
  234. @property (nonatomic, strong) NSMutableArray * allAudioDataArray;//所有的 播放数据(lastFileModel)
  235. #pragma mark - 缓存相关
  236. /**
  237. audioUrl对应的音频在本地的缓存地址
  238. @param audioUrl 网络音频url
  239. @return 无缓存时返回nil
  240. */
  241. - (NSString *)df_cachePath:(NSURL *)audioUrl;
  242. /**
  243. DFPlayer的缓存大小
  244. @param currentUser YES:当前用户 NO:所有用户
  245. @return 缓存大小
  246. */
  247. - (CGFloat)df_cacheSize:(BOOL)currentUser;
  248. /**
  249. 清除音频缓存
  250. @param audioUrl 网络音频url
  251. @return 是否清除成功(无缓存时返回YES)
  252. */
  253. - (BOOL)df_clearAudioCache:(NSURL *)audioUrl;
  254. /**
  255. 清除用户缓存
  256. @param currentUser YES:清除当前用户缓存 NO:清除所有用户缓存
  257. @return 是否清除成功(无缓存时返回YES)
  258. */
  259. - (BOOL)df_clearUserCache:(BOOL)currentUser;
  260. @end