简介
iOS 中视频播放自定义能力最强的就是 AVPlayer,今天主要就介绍 AVPlayer使用的核心流程和代码。
三个关键类 AVPlayerItem AVPlayer AVPlayerLayer
这是AVPlayer播放视频的核心三个类,apple 按照MVC的模式封装了视频播放的整个逻辑,AVPlayerItem 是 Model层 AVPlayer 是C 控制层 AVPlayerLayer 是view展示层。
- AVPlayerItem 存储了视频的基本信息 比如 时长 缓冲进度 播放状体等。
- AVPlayer提供了视频 播放 暂定 从视频那个位置开始播放的控制功能。
- AVPlayerLayer就是一个暂时 提供给我们自定义UI的
简单实例
NSURL *videoUrl = [NSURL URLWithString:urlStr];
AVAsset *asset = [AVAsset assetWithURL:videoUrl];
_videoItem = [AVPlayerItem playerItemWithAsset:asset]; // 视频资源信息 M
_player = [AVPlayer playerWithPlayerItem:_videoItem]; // 视频控制播放层 C
_playerLayer = [[AVPlayerLayer alloc]init]; // 视频展示层 V
_playerLayer.player = _player;
_playerLayer.frame = CGRectMake(0, 0, superView.bounds.size.width, superView.bounds.size.height);
[superView.layer addSublayer:_playerLayer]; // 添加到父视图的layer层
四个关键的监听
// 监听视频状态
[_videoItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:@"item.status"];
// 监听缓冲进度
[_videoItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:@"item.loaded"];
// 获取播放进度
[_player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
// CMTimeGetSeconds(time) // 已经播放的秒数
}];
// 接收播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlayEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
监听回调
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@“status”] && context == @“item.status”){// 可播放状态
if (((NSNumber *)[change objectForKey:NSKeyValueChangeNewKey]).integerValue== AVPlayerItemStatusReadyToPlay) {
[_player play];
// 视频总时长
self.duration = CMTimeGetSeconds(_videoItem.duration);
}
}
else if ([keyPath isEqualToString:@“loadedTimeRanges”] && context==@“item.loaded”){
// 缓冲进度
CMTimeRange rangeValue = [[change objectForKey:NSKeyValueChangeNewKey][0] CMTimeRangeValue];
NSLog(@"—rangeValue—%f-------%f",CMTimeGetSeconds(rangeValue.start),CMTimeGetSeconds(rangeValue.duration));
}
}
停止播放时一定要移除监听 非常重要
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_videoItem removeObserver:self forKeyPath:@"status"];
[_videoItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
更详细的使用 https://github.com/everyStudyNow/XBAVPlayer