美文网首页
iOS 视频播放(AVPlayer)的使用

iOS 视频播放(AVPlayer)的使用

作者: Double丶K | 来源:发表于2019-06-14 14:07 被阅读0次

    小记:很久没有用系统播放器,都快忘没了.整理下,好记住
    要实现系统视频播放的功能,就是使用下面的3个类,缺一不可.

    AVPlayerItem:继承NSObject,可以理解为一个模型,里面有很多视频的信息,时间,播放状态,设置播放的连接,等等功能.
    AVPlayer:播放器对象.播放,暂停,设置PlayerItem,时间监听的回调(addPeriodicTimeObserverForInterval),设置快进拖拽等方法(seekToTime)
    AVPlayerLayer:播放器的占位layer

    一:基本的播放功能

    使用这三个类能实现最基本的播放功能,添加进度条,播放暂停按钮,调节声音大小,都需要自己去添加.

    #import <AVFoundation/AVFoundation.h>
    @property (nonatomic, strong) AVPlayerItem      *playItem;
    @property (nonatomic, strong) AVPlayerLayer     *playerLayer;
    @property (nonatomic, strong) AVPlayer          *player;
    
    //
    _playItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:urlStr]];
    self.player = [[AVPlayer alloc] initWithPlayerItem:_playItem];
    _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
     _playerLayer.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 211);
    //视频在AvPlayerLayer中的显示方式
    _playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
    [self.view.layer addSublayer:_playerLayer];
    
    //再调用播放,最好通过监听播放器的status为AVPlayerStatusReadyToPlay再开始播放
    [_player play];
    

    二:细节处理

    这里只做了一个播放状态的监听

    //播放完成的通知,用于循环播放等功能
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playDidFinish) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
    //监听播放状态
    [self.playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    //不用的时候移除监听
    [self.playItem removeObserver:self forKeyPath:@"status"];
    
    #pragma mark -------播放属性监听--------
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
        if ([keyPath isEqualToString:@"status"]) {
            switch (self.playItem.status) {
                case AVPlayerStatusUnknown:
                    NSLog(@"KVO:未知状态,此时不能播放");
                    break;
                case AVPlayerStatusReadyToPlay:
                    if (!_player.timeControlStatus || _player.timeControlStatus != AVPlayerTimeControlStatusPaused) {
                        [_player play];
                    }
                    NSLog(@"KVO:准备完毕,可以播放");
                    break;
                case AVPlayerStatusFailed:
                    NSLog(@"KVO:加载失败,网络或者服务器出现问题");
                    break;
                default:
                    break;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS 视频播放(AVPlayer)的使用

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