iOS AVPlayer 播放本地视频
2018-12-17 本文已影响72人
飛天江郎
AVPlayer 这个自iOS 4.0+ 就有了的东西,随着iOS系统的不断优化而变得更强大,目前不止支持本地的音视频播放还指出网络的音视频播放。
但他仅仅是一个播放器,并未提供显示和其他的状态回调,所以在播放视频的时候一般都会伴随着其他的两个类一并使用:AVPlayerItem、AVPlayerLayer
AVPlayerItem它是对播放器要播放的内容进行时间监听以及状态监听等等的对象建模。简单的来说就是为了监听状态的。
AVPlayerLayer则是为为AVPLayer提供layer显示的。所以整个东西调度起来其实很简单。
//读取本地视频路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"VID_507" ofType:@"MOV"];
//为即将播放的视频内容进行建模
AVPlayerItem *avplayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];
//创建监听(这是一种KOV的监听模式)
[avplayerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//给播放器赋值要播放的对象模型
AVPlayer *avplayer = [AVPlayer playerWithPlayerItem:avplayerItem];
//指定显示的Layer
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:avplayer];
layer.frame = CGRectMake(0, 100, self.view.frame.size.width, 200);
[self.view.layer addSublayer:layer];
下面这里是状态的监听
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
AVPlayerItem *item = object;
//判断监听对象的状态
if ([keyPath isEqualToString:@"status"]) {
if (item.status == AVPlayerItemStatusReadyToPlay) {//准备好的
NSLog(@"AVPlayerItemStatusReadyToPlay");
} else if(item.status ==AVPlayerItemStatusUnknown){//未知的状态
NSLog(@"AVPlayerItemStatusUnknown");
}else if(item.status ==AVPlayerItemStatusFailed){//有错误的
NSLog(@"AVPlayerItemStatusFailed");
}
}
}
其中AVPlayer的主要功能在于控制,其提供的控制方法大致如下:
- play
播放
- pause
暂停
- rate
播放的速率
更多的内容还是需要查看文档
AVPlayerItem 则提供了更多关于播放过程中的参数获取
tracks
播放数组的跟踪对象
status
播放状态
AVPlayer<wbr style="box-sizing: inherit;">Item<wbr style="box-sizing: inherit;">Status
播放器当前的状态分为三种
AVPlayerItemStatusUnknown//状态未知
AVPlayerItemStatusReadyToPlay//准备就绪
AVPlayerItemStatusFailed// 由于错误,不再播放