DFPlayer接入说明


      

A simple and flexible iOS audio playback module. Based on AVPlayer, support local and remote audio playback, with caching, remote control, locking and control center information display, single sequential and random playback,Lyrics sync,and other basic audio player functions, using a few code can realize the function of player.(简单又灵活的iOS音频播放组件。基于AVPlayer,支持本地和远程音频播放,具有缓存、耳机线控、锁屏和控制中心信息展示、单曲顺序随机播放、airplay播放、歌词同步、记录上次播放进度等基本的音频播放器功能,DFPlayer封装了缓冲条、进度条、播放暂停按钮、下一首按钮、上一首按钮、播放模式按钮、airplay按钮、歌词同步的tableview等UI控件,一行代码布局即可实现相应功能。)

DFPlayer:关于iOS音频播放,传音频数据给我就好了🙃

If possible, please give me a star in github.✧(≖ ◡ ≖✿)🌹

github地址:https://github.com/ihoudf/DFPlayer

视频介绍:http://www.iqiyi.com/w_19ruzcqjqh.html

目录

安装

接入方法

版本说明

详细文档


安装(最低支持 iOS 7.0)

手动安装:
1
2
下载,并将DFPlayer文件夹添加(拖放)到工程
import "DFPlayer.h"
CocoaPods:
1
2
3
在 Podfile 中添加: pod 'DFPlayer'
执行 pod install 或 pod update
import "DFPlayer.h"
  • DFPLayer使用AFNetworkReachabilityManager进行网络监测,如正在使用AFNetworking,删除DFPlayer中的相关文件。


版本说明

当前版本1.0.5,pods同步。查看更多版本

本次更新:

1
2
3
4
5
6
代码解耦
增加运行时断点续传
改用可扩展的状态码提示
播放模式为DFPlayerModeOnlyOnce时,增加下一首(上一首)按钮行为
优化歌词同步
其他逻辑优化



接入方法

1.初始化DFPlayer,设置数据源(必须)

1
2
3
[[DFPlayer shareInstance] df_initPlayerWithUserId:nil];//初始化
[DFPlayer shareInstance].dataSource = self;//设置数据源
[[DFPlayer shareInstance] df_reloadData];//刷新数据源

2.实现数据源,将音频数据传给DFPlayer(必须)

1
2
3
4
5
6
7
8
9
//(必须)
- (NSArray<DFPlayerModel *> *)df_playerModelArray{
//在这里将音频数据传给DFPlayer
}
//(可选)
- (DFPlayerInfoModel *)df_playerAudioInfoModel:(DFPlayer *)player{
//DFPlayer收到某个音频的播放请求时,会调用这个方法请求该音频的音频名、歌手、专辑名、歌词、配图等信息。
}

3.选择AudioId对应的音频加入播放队列准备播放(必须)

1
[[DFPlayer shareInstance] df_playerPlayWithAudioId:audioId];

4.选择DFPLayer中提供的UI控件,布局到页面(可选)

  • DFPlayer封装了歌词tableview(提供逐句和逐字两种模式的基于Lrc的歌词同步)、缓冲条、进度条、播放暂停按钮、下一首按钮、上一首按钮、播放模式按钮(单曲、顺序、随机)、airplay按钮、当前时间Label、总时间Label。
  • 你只需要:
    (1)同名更换DFPlayer.bundle中的图片
    (2)调用DFPlayerControlManager.h中暴露出来的方法,布局到自己的页面,即可实现相应的功能,无需其他代码。
1
2
3
4
5
6
7
8
9
//使用示例:
DFPlayerControlManager *manager = [DFPlayerControlManager shareInstance];
//播放暂停按钮
[manager df_playPauseBtnWithFrame:frame2 superView:superView block:nil];
//下一首按钮
[manager df_nextAudioBtnWithFrame:frame3 superView:superView block:nil];
//上一首按钮
[manager df_lastAudioBtnWithFrame:frame4 superView:superView block:nil];
...等,详细查看‘详细文档’。



详细文档

你一定会用到:

1、DFPlayer.h(音频播放管理器)

2、DFPlayerModel.h(model类)

你可能会用到:

3、DFPlayerControlManager.h(UI控件类)

-

DFPlayer(音频播放管理器)

-
  • 初始化和操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma mark - 初始化和操作
/**单例方法*/
+ (DFPlayer *)shareInstance;
/**
初始化播放器
@param userId 用户唯一Id。
isNeedCache(默认YES)为YES时,若同一设备登录不同账号:
1.userId存在时,DFPlayer将为每位用户建立不同的缓存文件目录。例如,user_001,user_002...
2.userId为nil或@""时,统一使用DFPlayerCache文件夹下的user_public文件夹作为缓存目录。
isNeedCache为NO时,userId设置无效,此时不会在沙盒创建缓存目录
*/
- (void)df_initPlayerWithUserId:(NSString *)userId;
/**刷新数据源数据*/
- (void)df_reloadData;
/**
选择audioId对应的音频开始播放。
说明:DFPlayer通过数据源方法提前获取数据,通过df_playerPlayWithAudioId选择对应音频播放。
而在删除、增加音频后需要调用[[DFPlayer shareInstance] df_reloadData];刷新数据。
DFPlayer内部实现里做了线程优化,合理范围内的大数据量也毫无压力。
*/
- (void)df_playerPlayWithAudioId:(NSUInteger)audioId;
/**播放*/
- (void)df_audioPlay;
/**暂停*/
- (void)df_audioPause;
/**下一首*/
- (void)df_audioNext;
/**上一首*/
- (void)df_audioLast;
/**
设置历史播放信息
(在合适的时机,调用该方法,将会在本地记录音频URL、当前播放到的时间、音频总时长、播放进度,以供下次继续播放)
@return 是否保存成功
*/
- (BOOL)df_setPreviousAudioModel;
/**
用历史播放信息配置播放器(数据源中要有该条音频的URL才能配置哦)
@return 是否配置成功
*/
- (BOOL)df_setPlayerWithPreviousAudioModel;
/**释放播放器,还原其他播放器*/
- (void)df_deallocPlayer;
/**实现远程线控功能,需替换main.m中UIApplicationMain函数的第三个参数。*/
- (NSString *)df_remoteControlClass;
/**音频跳转,value:时间百分比*/
- (void)df_seekToTimeWithValue:(CGFloat)value;
-
  • 设置相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//播放器类别
typedef NS_ENUM(NSInteger,DFPlayerAudioSessionCategory){
//用于播放。随静音键和屏幕关闭而静音。不终止其它应用播放声音
DFPlayerAudioSessionCategoryAmbient,
//用于播放。随静音键和屏幕关闭而静音。终止其它应用播放声音
DFPlayerAudioSessionCategorySoloAmbient,
//用于播放。不随静音键和屏幕关闭而静音。终止其它应用播放声音
//需要在工程里设置targets->capabilities->选择backgrounds modes->勾选audio,airplay,and picture in picture
DFPlayerAudioSessionCategoryPlayback,
//用于播放和录音。不随着静音键和屏幕关闭而静音。终止其他应用播放声音
DFPlayerAudioSessionCategoryPlayAndRecord,
//用于播放和录音。不随着静音键和屏幕关闭而静音。可多设备输出
DFPlayerAudioSessionCategoryMultiRoute
};
//播放模式
typedef NS_ENUM(NSInteger, DFPlayerMode){
DFPlayerModeOnlyOnce, //单曲只播放一次
DFPlayerModeSingleCycle, //单曲循环。默认。
DFPlayerModeOrderCycle, //顺序循环
DFPlayerModeShuffleCycle //随机循环
};
@property (nonatomic, weak) id<DFPlayerDelegate> delegate;
@property (nonatomic, weak) id<DFPlayerDataSource> dataSource;
#pragma mark - 设置类
/**播放器类型,默认DFPlayerAudioSessionCategorySoloAmbient*/
@property (nonatomic, assign) DFPlayerAudioSessionCategory category;
/**
播放模式,首次默认DFPlayerModeSingleCycle。设置播放模式后,DFPlayer将为您记录用户的选择。
如需每次启动都设置固定某一个播放模式,请在初始化播放器后,调用[DFPlayer shareInstance].playMode = XX;重置播放模式。
*/
@property (nonatomic, assign) DFPlayerMode playMode;
/**是否监听播放进度,默认YES*/
@property (nonatomic, assign) BOOL isObserveProgress;
/**是否监听缓冲进度,默认YES*/
@property (nonatomic, assign) BOOL isObserveBufferProgress;
/**是否需要缓存,默认YES*/
@property (nonatomic, assign) BOOL isNeedCache;
/**是否需要耳机线控功能,默认YES*/
@property (nonatomic, assign) BOOL isRemoteControl;
/**
DFPlayerModeOnlyOnce(单曲只播放一次)模式下,
点击下一首(上一首)按钮(或使用线控播放下一首、上一首),
YES则播放下一首(上一首),NO则无响应。
DFPlayerModeSingleCycle(单曲循环)模式下,
点击下一首(上一首)按钮(或使用线控播放下一首、上一首)是重新开始播放当前音频还是播放下一首(上一首),
移动版QQ音乐是播放下一首(上一首),PC版QQ音乐是重新开始播放当前音频
DFPlayer默认YES,即采用移动版QQ音乐设置。NO则重新开始播放当前音频
*/
@property (nonatomic, assign) BOOL isManualToPlay;
/**
当currentAudioModel存在时,是否插入耳机音频自动恢复播放,默认NO
当您没有实现代理8的情况下,DFPlayer默认拨出耳机音频自动停止,插入耳机音频不会自动恢复。你可通过此属性控制插入耳机时音频是否可自动恢复
当您实现代理8时,耳机插入拔出时的播放暂停逻辑由您处理。
*/
@property (nonatomic, assign) BOOL isHeadPhoneAutoPlay;
/**
是否监测WWAN无线广域网(2g/3g/4g),默认NO。
播放本地音频(工程目录和沙盒文件)不监测。
播放网络音频时,DFPlayer为您实现wifi下自动播放,无网络有缓存播放缓存,无网络无缓存返回无网络错误码。
基于播放器具有循环播放的功能,开启该属性,无线广域网(WWAN)网络状态通过代理6返回错误码1。
*/
@property (nonatomic, assign) BOOL isObserveWWAN;
/**
是否监听服务器文件修改时间,默认NO。
在播放网络音频且需要DFPlayer的缓存功能的情况下,开启该属性,不必频繁更换服务端文件名来更新客户端播放内容。
比如,你的服务器上有audioname.mp3资源,若更改音频内容而需重新上传音频时,您不必更改文件名以保证客户端获取最新资源,本属性为YES即可完成。
第一次请求某资源时,DFPlayer缓存文件的同时会记录文件在服务器端的修改时间。
开启该属性,以后播放该资源时,DFPlayer会判断服务端文件是否修改过,修改过则加载新资源,没有修改过则播放缓存文件。
关闭此属性,有缓存时将直接播放缓存,不做更新校验,在弱网环境下播放响应速度更快。但您可自行实现每隔多少天或在哪一天检测的逻辑。
无网络连接时,有缓存直接播放缓存文件。
*/
@property (nonatomic, assign) BOOL isObserveFileModifiedTime;
-
  • 代理和数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@protocol DFPlayerDataSource <NSObject>
@required
/**
数据源1:音频model数组
*/
- (NSArray<DFPlayerModel *> *)df_playerModelArray;
@optional
/**
数据源2:音频信息model
当DFPlayer收到播放请求时,会调用此方法请求当前音频的信息
根据player.currentAudioModel.audioId获取音频在数组中的位置,返回对应的音频信息model
@param player DFPlayer音频播放管理器
*/
- (DFPlayerInfoModel *)df_playerAudioInfoModel:(DFPlayer *)player;
@end
@protocol DFPlayerDelegate <NSObject>
@optional
/**
代理1:音频将要加入播放队列
@param player DFPlayer音频播放管理器
*/
- (void)df_playerAudioWillAddToPlayQueue:(DFPlayer *)player;
/**
代理2:准备播放
@param player DFPlayer音频播放管理器
*/
- (void)df_playerReadyToPlay:(DFPlayer *)player;
/**
代理3:缓冲进度代理 (属性isObserveBufferProgress(默认YES)为YES时有效)
@param player DFPlayer音频播放管理器
@param bufferProgress 缓冲进度
@param totalTime 音频总时长
*/
- (void)df_player:(DFPlayer *)player
bufferProgress:(CGFloat)bufferProgress
totalTime:(CGFloat)totalTime;
/**
代理4:播放进度代理 (属性isObserveProgress(默认YES)为YES时有效)
@param player DFPlayer音频播放管理器
@param progress 播放进度
@param currentTime 当前播放到的时间
@param totalTime 音频总时长
*/
- (void)df_player:(DFPlayer *)player
progress:(CGFloat)progress
currentTime:(CGFloat)currentTime
totalTime:(CGFloat)totalTime;
/**
代理5:播放结束代理
@param player FPlayer音频播放管理器
*/
- (void)df_playerDidPlayToEndTime:(DFPlayer *)player;
/**
代理6:播放状态码代理
@param player DFPlayer音频播放管理器
@param statusCode 状态码
*/
- (void)df_player:(DFPlayer *)player didGetStatusCode:(DFPlayerStatusCode)statusCode;
/**
代理7:播放器被系统打断代理
(DFPlayer默认被系统打断暂停播放,打断结束检测能够播放则恢复播放,如果实现此代理,打断逻辑由您处理)
@param player DFPlayer音频播放管理器
@param isInterrupted YES:被系统打断开始 NO:被系统打断结束
*/
- (void)df_player:(DFPlayer *)player isInterrupted:(BOOL)isInterrupted;
/**
代理8:监听耳机插入拔出代理
@param player DFPlayer音频播放管理器
@param isHeadphone YES:插入 NO:拔出
*/
- (void)df_player:(DFPlayer *)player isHeadphone:(BOOL)isHeadphone;
@end
-
  • 状态相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//状态码
typedef NS_ENUM(NSUInteger, DFPlayerStatusCode) {
DFPlayerStatus_NetworkUnavailable = 0,//没有网络连接(注意:对于未缓存的网络音频,点击播放时若无网络会返回该状态码,播放时若无网络也会返回该状态码哦。DFPlayer支持运行时断点续传,即缓冲时网络从无到有,可以断点续传,而某音频没缓冲完就退出app,再进入app没做断点续传,以上特点与QQ音乐一致)
DFPlayerStatus_NetworkViaWWAN = 1,//WWAN网络状态(注意:属性isObserveWWAN(默认NO)为YES时,对于未缓存的网络音频,只在点击该音频时返回该状态码。而音频正在缓冲时,网络状态由wifi到wwan并不会返回该状态码,以上特点与QQ音乐一致)
DFPlayerStatus_RequestTimeOut = 2,//音频请求超时
DFPlayerStatus_UnavailableData = 3,//无法获得该音频资源
DFPlayerStatus_UnavailableURL = 4,//无效的URL地址
DFPlayerStatus_PlayError = 5,//音频无法播放
DFPlayerStatus_DataError = 6,//点击的音频ID不在当前数据源里(即数组越界)
DFPlayerStatus_CacheFailure = 7,//当前音频缓存失败
DFPlayerStatus_CacheSuccess = 8,//当前音频缓存完成
DFPlayerStatus_SetPreviousAudioModelError = 9,//配置历史音频信息失败
DFPlayerStatus_UnknownError = 100,//未知错误
};
//播放器状态
typedef NS_ENUM(NSInteger, DFPlayerState) {
DFPlayerStateFailed, // 播放失败
DFPlayerStateBuffering, // 缓冲中
DFPlayerStatePlaying, // 播放中
DFPlayerStatePause, // 暂停播放
DFPlayerStateStopped // 停止播放
};
#pragma mark - 状态类
/**播放器状态*/
@property (nonatomic, readonly, assign) DFPlayerState state;
/**当前正在播放的音频model*/
@property (nonatomic, readonly, strong) DFPlayerModel *currentAudioModel;
/**当前正在播放的音频信息model*/
@property (nonatomic, readonly, strong) DFPlayerInfoModel *currentAudioInfoModel;
/**当前音频缓冲进度*/
@property (nonatomic, readonly, assign) CGFloat bufferProgress;
/**当前音频播放进度*/
@property (nonatomic, readonly, assign) CGFloat progress;
/**当前音频当前时间*/
@property (nonatomic, readonly, assign) CGFloat currentTime;
/**当前音频总时长*/
@property (nonatomic, readonly, assign) CGFloat totalTime;
/**上次播放的音频信息。(本地音频或网络音频已缓存时有效)*/
@property (nonatomic, readonly, strong) DFPlayerPreviousAudioModel *previousAudioModel;
-
  • 缓存和清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
url对应音频是否已经在本地缓存
@param url 网络音频url
@return 有缓存返回缓存地址,无缓存返回nil
*/
+ (NSString *)df_playerCheckIsCachedWithAudioUrl:(NSURL *)url;
/**
清除url对应的本地缓存
@param url 网络音频url
@param block 是否清除成功 错误信息
*/
+ (void)df_playerClearCacheWithAudioUrl:(NSURL *)url
block:(void(^)(BOOL isSuccess, NSError *error))block;
/**
清除DFPlayer产生的缓存
@param isClearCurrentUser YES:清除当前用户缓存 NO:清除所有用户缓存
@param block 是否清除成功 错误信息
*/
+ (void)df_playerClearCacheForCurrentUser:(BOOL)isClearCurrentUser
block:(void(^)(BOOL isSuccess, NSError *error))block;
/**
计算DFPlayer的缓存大小
@param isCurrentUser YES:计算当前用户缓存大小 NO:计算所有用户缓存大小
@return 大小
*/
+ (CGFloat)df_playerCountCacheSizeForCurrentUser:(BOOL)isCurrentUser;
/**
计算系统磁盘空间 剩余可用空间
@param block totalSize:总空间 freeSize:剩余空间
*/
+ (void)df_countSystemSizeBlock:(void(^)(CGFloat totalSize,CGFloat freeSize))block;
-

DFPlayerModel(model类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
数据model类(必传属性) - IMPORTANT
*/
@interface DFPlayerModel : NSObject
/**音频Id。从0开始,仅标识当前音频在数组中的位置*/
@property (nonatomic, assign) NSUInteger audioId;
/**音频地址*/
@property (nonatomic, nonnull, strong) NSURL *audioUrl;
@end
/**
音频信息model类(非必传属性)
*/
@interface DFPlayerInfoModel : NSObject
/**歌词*/
@property (nonatomic, nullable, copy) NSString *audioLyric;
/*正确传入以下属性时,DFPlayer将自动设置锁屏模式和控制中心的播放信息展示*/
/**音频名*/
@property (nonatomic, nullable, copy) NSString *audioName;
/**专辑名*/
@property (nonatomic, nullable, copy) NSString *audioAlbum;
/**歌手名*/
@property (nonatomic, nullable, copy) NSString *audioSinger;
/**音频配图*/
@property (nonatomic, nullable, copy) UIImage *audioImage;
@end
/**
此model用于获取上次播放的音频信息
*/
@interface DFPlayerPreviousAudioModel : NSObject
/**网络音频地址或本地音频名*/
@property (nonatomic, readonly, nonnull, copy) NSString *audioUrlAbsoluteString;
/**音频总时长*/
@property (nonatomic, readonly, assign) CGFloat totalTime;
/**以下属性只有缓存过或者本地音频才会配置该属性 */
/**音频当前播放到的时间*/
@property (nonatomic, readonly, assign) CGFloat currentTime;
/**音频播放进度*/
@property (nonatomic, readonly, assign) CGFloat progress;
@end
-

DFPlayerControlManager(UI控件类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
DFPlayer控制管理器
*/
@interface DFPlayerControlManager : NSObject
/**单利方法*/
+ (DFPlayerControlManager *_Nullable)shareInstance;
/**调用该方法将停止更新与进度相关的UI控件(除了歌词tableview)的刷新*/
- (void)df_stopUpdateProgress;
/**调用该方法将恢复更新与进度相关的UI控件(除了歌词tableview)的刷新*/
- (void)df_resumeUpdateProgress;
/**(下面的方法可以显示出airplay按钮,若完善airplay功能需要用到私有API,故不建议使用)
AirPlay按钮(背景图片在DFPlayer.bundle中同名替换相应的图片即可)
airplay按钮是系统按钮,当系统检测到airplay可用时才会显示。
@param frame AirPlay按钮 frame
@param backgroundColor 背景颜色
@param superView AirPlayView父视图
@return AirPlayView
*/
- (UIView *_Nullable)df_airPlayViewWithFrame:(CGRect)frame
backgroundColor:(UIColor *_Nonnull)backgroundColor
superView:(UIView *_Nonnull)superView;
/**
播放暂停按钮(背景图片在DFPlayer.bundle中同名替换相应的图片即可)
@param frame 按钮frame
@param superView 按钮父视图
@param block 按钮action 若无其他操作需求,传nil即可
@return 播放暂停按钮
*/
- (UIButton *_Nullable)df_playPauseBtnWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView
block:(void(^_Nullable)(void))block;
/**
上一首按钮(背景图片在DFPlayer.bundle中同名替换相应的图片即可)
@param frame 按钮frame
@param superView 按钮父视图
@param block 按钮action 若无其他操作需求,传nil即可
@return 上一首按钮
*/
- (UIButton *_Nullable)df_lastAudioBtnWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView
block:(void(^_Nullable)(void))block;
/**
下一首按钮(背景图片在DFPlayer.bundle中同名替换相应的图片即可)
@param frame 按钮frame
@param superView 按钮父视图
@param block 按钮action 若无其他操作需求,传nil即可
@return 下一首按钮
*/
- (UIButton *_Nullable)df_nextAudioBtnWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView
block:(void(^_Nullable)(void))block;
/**
播放模式按钮(单曲循环,顺序循环,随机循环) (DFPlayerMode为DFPlayerModeOnlyOnce时此按钮会隐藏)
@param frame 按钮frame
@param superView 按钮父视图
@param block 按钮action 若无其他操作需求,传nil即可
@return 播放模式设置按钮
* 注意:当设置了DFPlayer的播放模式以后,DFPlayer将为您记录用户的选择,并在下次启动app时选择用户设置的播放模式。
如需每次启动都设置固定某一个播放模式,请在初始化播放器后,调用[DFPlayer shareInstance].playMode = XX;重置播放模式。
*/
- (UIButton *_Nullable)df_typeControlBtnWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView
block:(void(^_Nullable)(void))block;
/**
缓冲进度条
@param frame frame
@param trackTintColor 未缓冲部分进度条颜色
@param progressTintColor 已缓冲部分进度条颜色
@param superView 进度条父视图
@return 进度条
*/
- (UIProgressView *_Nullable)df_bufferProgressViewWithFrame:(CGRect)frame
trackTintColor:(UIColor *_Nonnull)trackTintColor
progressTintColor:(UIColor *_Nonnull)progressTintColor
superView:(UIView *_Nonnull)superView;
/**
播放进度条
@param frame frame
@param minimumTrackTintColor 滑块左边滑动条的颜色
@param maximumTrackTintColor 滑块右边滑动条的颜色
@param trackHeight 滑动条的高度(长度采用frame的width)
@param thumbSize 滑块的大小
@param superView 进度条父视图
@return 进度条
*/
- (UISlider *_Nullable)df_sliderWithFrame:(CGRect)frame
minimumTrackTintColor:(UIColor *_Nonnull)minimumTrackTintColor
maximumTrackTintColor:(UIColor *_Nonnull)maximumTrackTintColor
trackHeight:(CGFloat)trackHeight
thumbSize:(CGSize)thumbSize
superView:(UIView *_Nonnull)superView;
/**
音频当前时间label
@param frame frame
@param superView label父视图
@return label
*/
- (UILabel *_Nullable)df_currentTimeLabelWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView;
/**
音频总时长label
@param frame frame
@param superView label父视图
@return label
*/
- (UILabel *_Nullable)df_totalTimeLabelWithFrame:(CGRect)frame
superView:(UIView *_Nonnull)superView;
#pragma mark - 歌词tableView相关
/**
lyricTableview
①采用lrc标准格式编写,即"[00:00.00]歌词" 或 "[00:00]歌词" 或 "[00:00:00]歌词"
②根据lrc歌词软件开发标准,凡具有“[*:*]”形式的都应认为是标签(注意:其中的冒号并非全角字符“:”)。凡是标签都不应显示。
③支持单句歌词多个时间的格式,如“[00:10.00][00:50.00][00:70.00]歌词”
④lrc歌词文件单行只有时间标签,没有歌词内容的,将被认作为上一个相邻时间内歌词的结束时间,并不做空行显示处理。比如
[00:11.11]歌词
[00:22.22] (22秒22毫米,该时间下无歌词显示,将被认作为上一个相邻时间歌词的演唱结束时间,此处的相邻不是位置的相邻,而是时间大小的相邻)
⑤如果歌词中需要空行,DFPlayer默认时间标签后的“####”是空行标志,如“[00:11.11]####”,DFPlayer将在解析到歌词为####时做空行显示
详情查看demo中”许嵩(Vae)-有何不可.lrc“文件
⑥DFPlayer认为每个时间标签都是一个单元格。只不过时间标签后无歌词时,DFPlayer将该单元格隐藏。
⑦DFPlayer不对单句歌词做换行处理,所以单行歌词长度尽量不要超过tableview的宽度,当超出时,DFPlayer用末尾省略号处理。
@param frame tableview frame
@param contentInset tableview contentInset
@param cellRowHeight tableview 单行rowHeight
@param cellBackgroundColor cell背景色
@param currentLineLrcForegroundTextColor 当前行歌词文字前景色(此属性不为nil时,采用卡拉OK模式显示)
@param currentLineLrcBackgroundTextColor 当前行歌词文字背景色
@param otherLineLrcBackgroundTextColor 其他行歌词文字颜色
@param currentLineLrcFont 当前行歌词字体
@param otherLineLrcFont 其他行歌词字体
@param superView 父视图
@param clickBlock 点击某个歌词cell。indexpath:该行cell的indexpath
@return 歌词tableView
*/
- (UITableView *_Nullable)df_lyricTableViewWithFrame:(CGRect)frame
contentInset:(UIEdgeInsets)contentInset
cellRowHeight:(CGFloat)cellRowHeight
cellBackgroundColor:(UIColor *_Nullable)cellBackgroundColor
currentLineLrcForegroundTextColor:(UIColor *_Nullable)currentLineLrcForegroundTextColor
currentLineLrcBackgroundTextColor:(UIColor *_Nonnull)currentLineLrcBackgroundTextColor
otherLineLrcBackgroundTextColor:(UIColor *_Nonnull)otherLineLrcBackgroundTextColor
currentLineLrcFont:(UIFont *_Nonnull)currentLineLrcFont
otherLineLrcFont:(UIFont *_Nonnull)otherLineLrcFont
superView:(UIView *_Nonnull)superView
clickBlock:(void(^_Nullable)(NSIndexPath * _Nullable indexpath))clickBlock;
/**DFPlayer不管理lyricTableview中歌词更新的暂停和恢复*/
/**停止更新lyricTableview中歌词的刷新*/
- (void)df_playerLyricTableviewStopUpdate;
/**恢复更新lyricTableview中歌词的刷新*/
- (void)df_playerLyricTableviewResumeUpdate;
@end

– If possible, please give me a star in github. -

END and THANKS!

LOVE YOU!🌹