AVPlayer
一、定义必要的属性
//AVplayer
@property (strong, nonatomic)AVPlayer *player;//播放器
@property (strong, nonatomic)AVPlayerItem *playerItem;//播放单元
@property (strong, nonatomic)AVPlayerLayer *playerLayer;//播放界面(layer)
二、必要的配置
1.视频URL:
/ 本地视频
- (NSURL *)getLocalUrl{
NSString *urlString = [[NSBundle mainBundle] pathForResource:@"xxx.mp4" ofType:nil];
NSURL *url = [NSURL fileURLWithPath:urlString];
return url;
}
// 网络视频
- (NSURL *)getNetworkUrl{
NSString *urlString = @"http://xxx.xxx/xxx.mp4";
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
return url;
}
2.播放单元
NSURL *mediaURL = [self getLocalUrl]; //或getNetworkUrl
//AVPlayerItem
self.playerItem = [AVPlayerItem playerItemWithURL:mediaURL];
3.播放对象
//AVPlayer
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
4.播放器的Layer
//AVPlayerLayer
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.frame = view.bounds; self.playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;//视频填充模式
[view.layer addSublayer:self.playerLayer];
[self.view addSubview:view];
5.开始播放
[self.player play];
到此一个简单的视频播放器完成。
三、常规设置
1.播放/暂停
[self.player play];
[self.player pause];
2.指定位置播放
//指定位置播放
[self.player seekToTime:startTime completionHandler:^(BOOL finished) {
if (finished) {
//到达指定位置,可以播放
[self.player play]; //注意使用weakself,此处仅为示例
}else{
//没有完成
}
}];
3.观察状态变化
//通过KVO来观察status属性的变化,来获得状态信息
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//在observe方法中判断status
AVPlayerItemStatusUnknown, //未知错误
AVPlayerItemStatusReadyToPlay,//已准备好
AVPlayerItemStatusFailed //获取失败
四、其他操作
1.视频替换
NSURL *mediaURL = [self getNetworkUrl];
//AVPlayerItem
self.playerItem = [AVPlayerItem playerItemWithURL:mediaURL];
[self.player replaceCurrentItemWithPlayerItem:self.playerItem];
2.缓冲进度
NSArray *array = _player.currentItem.loadedTimeRanges;
CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次缓冲时间范围
NSTimeInterval startSeconds = CMTimeGetSeconds(timeRange.start);//本次缓冲起始时间
NSTimeInterval durationSeconds = CMTimeGetSeconds(timeRange.duration);//缓冲时间
NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度
float totalTime = CMTimeGetSeconds(_player.currentItem.duration);//视频总长度
float progress = totalBuffer/totalTime;//缓冲进度
3.视频时间
CMTimeGetSeconds(_player.currentItem.duration)//视频总时间
CMTimeGetSeconds(_player.currentTime)//当前时间
//更新视频时间的方法
- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block