美文网首页
iOS关于AVPlayer使用细节的处理

iOS关于AVPlayer使用细节的处理

作者: 流年划过颜夕 | 来源:发表于2018-12-29 09:43 被阅读215次

关于AVPlayer的使用,我看绝大多数的博客上介绍的用法基本如下:

        AVPlayerItem * playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:item.localPath]];
        AVPlayer * player = [AVPlayer playerWithPlayerItem:playerItem];
        AVPlayerLayer * playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
        playerLayer.frame = view.bounds;
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;

        [view.layer addSublayer:playerLayer];
        [player play]

这样写简单粗暴,确实能正常播放,但是细细研究就发现不太亲和。

1.如果多次重复使用,就会多次调用:
[view.layer addSublayer:playerLayer];

view.layer.sublayers会持续增多,内存会慢慢递增,如果加载资源的内存过大,会有潜在风险,甚至导致奔溃。


sublayers.png

所以最好在addSublayer前移除已存在的AVPlayerLayer:
for (CALayer *layer in view.layer.sublayers) {
if ([layer class] == [AVPlayerLayer class]) {
[layer removeFromSuperlayer];
}
}

2.如果再细节处理到位点,可以利用KVO监控playerItem的状态
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"status"]) {
    //取出status的新值
    AVPlayerItemStatus status = [change[NSKeyValueChangeNewKey]intValue];

    switch (status) {
        case AVPlayerItemStatusFailed:
            NSLog(@"视频资源有误,加载失败");
            break;
        case AVPlayerItemStatusReadyToPlay:
            NSLog(@"视频资源加载成功,准备好播放了");
            break;
        case AVPlayerItemStatusUnknown:
            NSLog(@"视频资源出现未知错误");
            break;
        default:
            break;
    }
}
//移除监听(观察者)
[object removeObserver:self forKeyPath:@"status"];}

当状态为AVPlayerItemStatusReadyToPlay时,说明资源已经准备到位,这时再使用[player play]更为合理

相关文章

网友评论

      本文标题:iOS关于AVPlayer使用细节的处理

      本文链接:https://www.haomeiwen.com/subject/ldculqtx.html