DFPlayer.h 9.1 KB

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