CYC-AVPlayer播放器的简单使用
2015-10-05 19:31
429 查看
AVPlayer播放器 简单易懂 使用方便 相对于AudioPlayer 更适合初学者. 本次大概会涉及到 怎么播放歌曲 下一曲 暂停 下一曲 以及歌曲 的时间 随着进度 而变化 歌词的颜色变化等 代码量甚多
播放列表
具体实现
播放界面
具体实现
歌词解析时 需要的 单例 里面具体包括怎么剪接歌词 以及时间方面的问题
实现
布局以及在控制器中的具体操作 将在 下一篇中提及
播放列表
model 里面的东西就不陈述了 需要什么类型,就从接口中找到 现在开始说起单例 #import <Foundation/Foundation.h> @interface MusicListManager : NSObject // 单例声明 + (instancetype )shareManager; // 数据请求 结果回调 - (void)requestDataForReloadWithBlock:(void(^)(NSArray *array))block; // 通过下标 获取 数据模型 - (MusicListModel *)getMusicListModelAtIndex:(NSInteger )index; // 获取有多少条数据 - (NSInteger) getAllDataArrayCount; @end
具体实现
#import "MusicListManager.h" @interface MusicListManager() @property (nonatomic, retain) NSMutableArray *allDataArray; @end @implementation MusicListManager // 单例 + (instancetype )shareManager { // 新的方法 跟之前的一样 static MusicListManager *manager = nil; static dispatch_once_t onceToken; dispatch_once (&onceToken, ^{ manager = [[[self class] alloc] init]; }); return manager; } // 数据请求 用block 方法 进行回调 - (void)requestDataForReloadWithBlock:(void(^)(NSArray *array))block { // 创建子线程 做数据解析 dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 通过接口 获取数据 用数组接收 NSArray *array = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:kMusicplayerUrl]]; // 遍历数组 for (NSDictionary *dic in array) { MusicListModel *model = [[MusicListModel alloc] init]; // model 赋值 [model setValuesForKeysWithDictionary:dic]; // 把model存储到数组中 [self.allDataArray addObject:model]; } // 回到主线程做结果回调 dispatch_async(dispatch_get_main_queue(), ^{ block(self.allDataArray); }); }); } #pragma mark - 通过下标 获取 数据模型 - (MusicListModel *)getMusicListModelAtIndex:(NSInteger )index { MusicListModel *model = self.allDataArray[index]; return model; } #pragma mark - 获取有多少条数据 - (NSInteger)getAllDataArrayCount { return self.allDataArray.count; } // 懒方法 - (NSMutableArray *)allDataArray { if (!_allDataArray) { _allDataArray = [NSMutableArray array]; } return _allDataArray; } @end
播放界面
#import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> // 注意:AVPlayer播放器需要导入#import <AVFoundation/AVFoundation.h> @protocol MusicPlayerManagerDelegate <NSObject> - (void)playingWithProgress:(CGFloat)progress; @end @interface MusicPlayerManager : NSObject // 通过下标获取model @property (nonatomic,assign) NSInteger index; // 当前播放的model模型 @property (nonatomic, strong) MusicListModel *listModel; // 单例 + (MusicPlayerManager *)shareMusicPlayer; // 属性声明 // 播放器 @property (nonatomic, strong) AVPlayer *player; // 音量调节 @property (nonatomic, assign) CGFloat volum; // 代理声明 @property (nonatomic, assign) id<MusicPlayerManagerDelegate>delegete; // 方法声明 // 设置播放器的Url - (void)playingWithUrl:(NSString *)url; // 开始播放 - (void)musicPlay; // 暂停播放 - (void)musicPause; // 播放状态的切换 - (BOOL)musicPlayOrPause; // slider 滑动 设置播放进度方法 -- 声明 - (void)musicSeekToTime:(CGFloat)time; @end
具体实现
#import "MusicPlayerManager.h" @interface MusicPlayerManager () { // 设置播放状态 BOOL isPlaying; } // 定时器 跟随播放进度 @property (nonatomic, strong) NSTimer *timer; @end @implementation MusicPlayerManager // 单例 + (MusicPlayerManager *)shareMusicPlayer { // 新的方法 跟之前的一样 static MusicPlayerManager *manager = nil; static dispatch_once_t onceToken; dispatch_once (&onceToken, ^{ manager = [[[self class] alloc] init]; manager.player = [[AVPlayer alloc] init]; manager.player.volume = 10; }); return manager; } // 方法声明 // 设置播放器的Url - (void)playingWithUrl:(NSString *)url { // 设置items 放进播放器中 然后开始播放 AVPlayerItem *items = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:url]]; [self.player replaceCurrentItemWithPlayerItem:items]; [self musicPlay]; } // 开始播放 - (void)musicPlay { self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playingAction) userInfo:nil repeats:YES]; isPlaying = YES; [self.player play]; } // 暂停播放 - (void)musicPause { if(self.timer) { // 让当前方法无效 [self.timer invalidate]; self.timer = nil; } isPlaying = NO; [self.player pause]; } // 播放状态的切换 - (BOOL)musicPlayOrPause { if (isPlaying) { [self musicPause]; return NO; }else { [self musicPlay]; return YES; } } #pragma mark - 音量调节的 set 和 get 方法 - (void)setVolum:(CGFloat)volum { self.player.volume = volum; } - (CGFloat)volum { return self.player.volume; } #pragma mark - 私有方法 #pragma mark - 播放过程中执行 - (void)playingAction { // 获取播放时间 CGFloat time = self.player.currentTime.value / self.player.currentTime.timescale; // 代理方法 将获取到的时间 传递到控制器 if(self.delegete && [self.delegete performSelector:@selector(playingWithProgress:)]) { [self.delegete playingWithProgress:time]; } } #pragma mark - slider 滑动 设置播放进度方法 -- 声明 - (void)musicSeekToTime:(CGFloat)time { // 先暂停 [self musicPause]; // 根据传递进来的时间进行 播放跳转 // 参数1 传递进去的时间值 time:(CGFloat) [self.player seekToTime:CMTimeMakeWithSeconds(time, self.player.currentTime.timescale) completionHandler:^(BOOL finished) { if (finished) { // 如果跳转完成 执行播放方法 [self musicPlay]; } }]; } @end
歌词解析时 需要的 单例 里面具体包括怎么剪接歌词 以及时间方面的问题
#import <Foundation/Foundation.h> @interface MusicLyricManager : NSObject // 声明单例 + (instancetype)shareManager; // 格式化歌词 创建歌词模型 并且存放进数组当中 - (void)formatLricModelWithLyric:(NSString *)lyric; // 返回模型长度 - (NSInteger)getLyricModelCount; // 根据下标取出当前歌词 - (NSString *)lyricAtIndex:(NSInteger)index; // 根据时间返回下标 - (NSInteger) indexOfTime:(CGFloat)time; // 根据下标指定播放进度 - (CGFloat)progressAtIndex:(NSInteger)index; @end
实现
#import "MusicLyricManager.h" #import "MusicLyricModel.h" @interface MusicLyricManager () @property (nonatomic, strong) NSMutableArray *allLyricModelArray; @end @implementation MusicLyricManager // 声明单例 + (instancetype)shareManager { static MusicLyricManager *manager = nil; static dispatch_once_t onceTocken; dispatch_once(&onceTocken, ^{ manager = [[[self class]alloc] init]; manager.allLyricModelArray = [NSMutableArray array]; }); return manager; } // 格式化歌词 创建歌词模型 并且存放进数组当中 - (void)formatLricModelWithLyric:(NSString *)lyric { // 先移除数组中的元素 [self.allLyricModelArray removeAllObjects]; // 根据 换行符"\n" 切分 NSArray *array = [lyric componentsSeparatedByString:@"\n"]; // 遍历 歌词数组 格式化歌词 组建模型 并存入数组中 for(int i = 0; i < array.count - 1; i++ ) { // 获取每一行歌词 NSString *str = array[i]; // 根据"]" 来拆分时间和歌词 NSArray *array1 = [str componentsSeparatedByString:@"]"]; #pragma mark - 如果字符串长度小于1 直接跳出来 if ([array1.firstObject length] < 1) { break; } // 时间 格式为"[00:4523]" 所以需要从1开始获取 NSString *timeStr = [array1.firstObject substringFromIndex:1]; // 时间格式为00:4523 所以去掉: NSArray *timeArray = [timeStr componentsSeparatedByString:@":"]; // 算出总时间 以秒为单位 CGFloat totalTime = [timeArray.firstObject floatValue] * 60 + [timeArray.lastObject floatValue]; // 歌词 NSString *lyricStr = array1.lastObject; // 初始化 歌词数据模型 MusicLyricModel *model = [[MusicLyricModel alloc] init]; // 歌词时间 model.time = totalTime; // 歌词 model.lyric = lyricStr; // 存入数组 [self.allLyricModelArray addObject:model]; } } // 返回模型长度 - (NSInteger)getLyricModelCount { return self.allLyricModelArray.count; } // 根据下标取出当前歌词 - (NSString *)lyricAtIndex:(NSInteger)index { MusicLyricModel *model = [self.allLyricModelArray objectAtIndex:index]; return model.lyric; } // 根据时间返回下标 - (NSInteger) indexOfTime:(CGFloat)time { NSInteger index = 0; for (int i = 0; i < self.allLyricModelArray.count - 1; i++) { MusicLyricModel *model = self.allLyricModelArray[i]; if (model.time > time) { index = i - 1 > 0 ? i - 1 :0; break; } } return index; } // 根据下标指定播放进度 - (CGFloat)progressAtIndex:(NSInteger)index { MusicLyricModel *model = self.allLyricModelArray[index]; CGFloat time = model.time; return time; } @end
布局以及在控制器中的具体操作 将在 下一篇中提及
相关文章推荐
- AVplayer的使用详解 完整注释
- iOS中AVPlayer的在线播放和播放进度条,音量条以及AVPlayer的后台播放
- AVPlayer视频播放的使用简介
- iOS编程——AVPlayer解决闪屏问题
- AVPlayer基本使用方法
- AVPlayer 播放在线视频和本地文件的设置区别
- AVPlayer vs. AVAudioPlayer
- 在IOS中使用AVPlayer去播放在线音频文件,并设置音量
- 那些年,追逐过的小视频
- IOS开发之AVPlayer
- 视频播放
- iOS开发之AVPlayer的精彩使用--->网易新闻视频播放界面的另类实现
- AVPlayer.h翻译
- AVPlayer 无间隔循环播放
- iOS 播放音频的几种方式
- 细数AVPlayer的那些坑
- libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常
- avplayer视频重复循环播放,视频重播
- iOS 基于AVPLayer封装视频播放器
- An AVPlayerItem cannot be associated with more than one instance of AVPlayer