CYC-AVPlayer播放器的简单使用
来源:互联网 发布:数据库的分类 编辑:程序博客网 时间:2024/05/17 05:03
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
布局以及在控制器中的具体操作 将在 下一篇中提及
0 0
- CYC-AVPlayer播放器的简单使用
- CYC-AVPlayer播放器的简单运用-02
- 基于AVPlayer简单封装的播放器
- CYC-NSFileManager的简单使用
- AVPlayer实现简单播放器
- 视频播放AVPlayer的使用
- CYC-集合视图 UICollectionView的简单使用
- 使用AVPlayer自定义支持全屏的播放器(一)
- 使用AVPlayer自定义支持全屏的播放器(二)
- AVPlayer简单地视频播放器
- iOS-AVPlayer的简单使用
- AVPlayer视频播放的使用简介
- ios 使用AVPlayer自定义视频播放器
- ios 使用AVPlayer自定义视频播放器
- 使用AVPlayer播放视频
- AVPlayer 实现视频播放器的开发
- AVPlayer 多媒体播放器
- AVPlayer 多媒体播放器
- LightOJ 1282 Leading and Trailing
- Objective-C NSData和NSMutableData
- iOS编程-------UITableViewEdit_move -----> UITableView 编辑
- POJ3565(最大权匹配)
- The Shawshank Redemption
- CYC-AVPlayer播放器的简单使用
- RecyclerView 解析
- Writing Fast Matlab code 1
- java记——随机数三个数的和
- 大数据下的日志--ElasticSearch部分(三)--Bulk,Search操作
- ”Hello World!“的前世今生
- mysql并发问题记录
- 大数据下的日志--ElasticSearch部分(四)--Mapping
- UVa 1586 - Molar mass【字符串】