最近有个简单播放器的需求需要实现,公司其他项目本身已有播放器实现但是业务逻辑不满足现有需求,所以参照原有模块并结合相关资料自己实现了一个简单播放器,该播放器是基于
AVPlayer
实现的。
播放器功能介绍
- 单例实现
- 播放、暂停、切歌、缓冲处理、播放进度实时更新
- 后台持续播放
- 音频中断处理
协议代理
播放器功能协议TTPlayerProtocol
1 | @protocol TTPlayerProtocol <NSObject> |
播放器状态代理TTAudioPlayerStatusDelegate
1 | @protocol TTAudioPlayerStatusDelegate <NSObject> |
数据模型协议 TTMusicModelProtocol
1 | @protocol TTMusicModelProtocol <NSObject> |
类介绍
TTAudioPlayer
播放器对象,实现了TTPlayerProtocol
协议1
2
3
4
5
6
7@interface TTAudioPlayer : NSObject<TTPlayerProtocol>
@property (nonatomic, weak) id<TTAudioPlayerStatusDelegate> delegate;
+ (instancetype)shareInstance;
@end
TTMusicModel
音乐数据模型,遵守TTMusicModelProtocol
协议,可扩展
1 | @interface TTMusicModel : NSObject<TTMusicModelProtocol> |
问题与功能实现细节
设置播放器在后台,锁屏,静音模式下都可以播放
1.在后台模式中打开音频播放模式
Targets–>Capabilities–>BackgroundModes–>ON
勾选 Audio,Airplay,and Picture in Picture
2.设置音频类别
这段代码我写在播放器初始化的时候1
2[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
3.开启后台任务
前面两步做完之后,app进入后台音频是可以继续播放,但是播完一首之后,后面的就不会播放了,这里开启后台任务就好了
1 | @interface AppDelegate () |
进入后台后开启任务1
2
3
4
5
6
7
8
9- (void)applicationDidEnterBackground:(UIApplication *)application {
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:self->bgTask];
self->bgTask = UIBackgroundTaskInvalid;
}];
}
进入前台,结束后台任务1
2
3
4
5
6- (void)applicationWillEnterForeground:(UIApplication *)application {
if (bgTask != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
处理中断事件
监听中断通知
1 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterreptionNotification:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]]; |
中断处理
1 | - (void)handleInterreptionNotification:(NSNotification *)notification { |
####