一个基于StreamingKit第三方框架简单的音频播放器
GitHub开源框架:https://github.com/tumtumtum/StreamingKit
主要功能
- 上一首、下一首、暂停、播放、切换播放模式、操作进度条等。
如图所示
- 封装STKAudioPlayer播放器
/** 单例 */ + (instancetype)shareInstance; /** 播放指定音频 @param URL 音频地址 */ - (void)ym_playWithURL:(NSURL *)URL; /** 暂停 */ - (void)ym_pause; /** 继续 */ - (void)ym_resume; /** 结束播放 */ - (void)ym_stop; /** 从指定时间开始播放 @param time 开始播放的时间 */ - (void)ym_seekToTime:(double)time;
- STKAudioPlayer的代理方法
- 音频开始播放
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer didStartPlayingQueueItemId:(NSObject *)queueItemId { YMLog(@"开始播放 : %@",queueItemId); }
- 当一个项目已完成缓冲时引发(可能是也可能不是当前正在播放的项目)
- 如果在播放器上调用seek,则同一项可能引发多次此事件
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer didFinishBufferingSourceWithQueueItemId:(NSObject *)queueItemId { YMLog(@"缓冲完成 : %@",queueItemId); }
- 当播放器状态改变时触发
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer stateChanged:(STKAudioPlayerState)state previousState:(STKAudioPlayerState)previousState { YMLog(@"播放器状态改变:%@",@(state)); }
- 当音频播放结束时触发
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer didFinishPlayingQueueItemId:(NSObject *)queueItemId withReason:(STKAudioPlayerStopReason)stopReason andProgress:(double)progress andDuration:(double)duration { YMLog(@"播放完成:%@",queueItemId); }
- 当发生意外且可能无法恢复的错误时引发(通常最好重新创建STKAudioPlauyer)
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer unexpectedError:(STKAudioPlayerErrorCode)errorCode { YMLog(@"播放错误:%@",@(errorCode)); }
- 可选实现从STKAudioPlayer获取日志信息(内部用于调试)
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer logInfo:(NSString *)line { YMLog(@"播放日志:%@",line); }
- 清除队列中的项时引发(通常是因为调用play、setDataSource或stop)
- (void)audioPlayer:(STKAudioPlayer *)audioPlayer didCancelQueuedItems:(NSArray *)queuedItems { }
- 音频开始播放是定义了一个开始播放的block,这里主要用于音频开始播放的时候旋转动画
@property (nonatomic, copy, nullable) void(^startPlayBlock)(NSURL *URL);
player.startPlayBlock = ^(NSURL * _Nonnull URL) { YMLog(@"开始播放:%@",URL); [ws.iconView resumeRotate]; //开始转动封面 [ws.phonePlayerColView startPlayingMusic]; [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadTitle" object:nil userInfo:@{@"name":ws.phonePlayerColView.currentModel.name}]; //更新图片 ws.iconView.imageUrl = ws.phonePlayerColView.currentModel.imageUrl; };
- 音频结束后,停止动画
@property (nonatomic, copy, nullable) void(^finishPlayBlock)(NSURL *URL);
player.finishPlayBlock = ^(NSURL * _Nonnull URL) { YMLog(@"播放完成:%@",URL); [ws.iconView stopRotating];//停止动画 };
- 需要时时更新音频的时长,进度,播放状态等一些信息,取出然后赋值到页面上,这里使用block回传数据
player.refreshBlock = ^(double duration, double progress, STKAudioPlayerState state, STKAudioPlayerErrorCode errorCode) { YMLog(@"时长:%f",duration); YMLog(@"进度:%f",progress); YMLog(@"播放状态:%ld",(long)state); YMLog(@"播放error:%ld",(long)errorCode); }
Demo连接:https://github.com/AndrewLJJ/MusicPlayer
掘金地址:https://juejin.im/post/5dc0da0ce51d4529ef3ef823