美文网首页
AVFoundation框架解析(一)AVPlayer

AVFoundation框架解析(一)AVPlayer

作者: _RG | 来源:发表于2020-04-16 14:21 被阅读0次

    1. AVPlayer常用方法

    AVPlayer是视频播放器管家

    其中包括以下方法

    + (instancetype)playerWithURL:(NSURL *)URL 创建一个带有资源的播发器,内部会隐式创建一个AVPlayerItem, 可以通过@property (nonatomic, readonly, nullable) AVPlayerItem *currentItem;获取;

    + (instancetype)playerWithPlayerItem:(nullable AVPlayerItem *)item 根据传入的item创建播放器

    @property (nonatomic, readonly) AVPlayerStatus status;
    status可以获取播放器当前的状态,有以下三个值,可以通过KVO来观察值的变化,以便获取播放过程中的错误情况

    AVPlayerStatusUnknown = 0,   播放未知状态,一般播放器加载URL或其他资源时的状态
    AVPlayerStatusReadyToPlay = 1,   资源加载完毕,准备就绪,可以播放状态
    AVPlayerStatusFailed = 2      播放失败状态
    

    @property (nonatomic, readonly, nullable) NSError *error;
    statusAVPlayerStatusFailed时, 可以通过error获取失败的信息

    2. (AVPlayerPlaybackControl)分类方法

    @interface AVPlayer (AVPlayerPlaybackControl)里面包含以下方法

    @property (nonatomic) float rate; 播放速率,默认是1.0倍速播放, 可以设置. 当速率为0时,表示暂停播放, 必须在play方法调用后设置才有效果

      AVPlayer *player = [AVPlayer playerWithURL:self.url];
    //有效设置
     [player play];
      player.rate = 1.8;
    
    //无效设置
    /*
        player.rate = 1.8;
        [player play];
    */
    
    

    或者使用- (void)playImmediatelyAtRate:(float)rate进行速率设置(注意,此API只支持iOS10以上版本)

    - (void)play; 开始播放

    - (void)pause; 暂停播放

    @property (nonatomic, readonly) AVPlayerTimeControlStatus timeControlStatus API_AVAILABLE(macos(10.12), ios(10.0))
    timeControlStatus 有以下几种值

    typedef NS_ENUM(NSInteger, AVPlayerTimeControlStatus) {
        AVPlayerTimeControlStatusPaused = 0, 暂停播放
        AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate = 1, 缓冲中
        AVPlayerTimeControlStatusPlaying = 2 正在播放
    }
    

    @property (nonatomic, readonly, nullable) AVPlayerWaitingReason reasonForWaitingToPlay 视频缓冲的原因

    AVPlayerItemControl分类方法

    @interface AVPlayer (AVPlayerItemControl) 包含
    @property (nonatomic, readonly, nullable) AVPlayerItem *currentItem; AVPlayerItem是播放资源的媒介,

    - (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item; 更换当前的item资源

    @property AVPlayerActionAtItemEnd actionAtItemEnd;

    typedef NS_ENUM(NSInteger, AVPlayerActionAtItemEnd)
    {
        /**
        指示当AVPlayerItem达到其结束时间时,播放器将自动前进到其
        队列中的下一个项目。此值仅支持AVQueuePlayer类的播放器。
        如果对非AVQueuePlayer类设置此值则会发生异常。
        */
        AVPlayerActionAtItemEndAdvance  = 0,
    
        /**
         播放完成后自动将rate设置为0.0使视频暂停。
        */
        AVPlayerActionAtItemEndPause    = 1,
    
        /**
        表示当AVPlayerItem达到其结束时间时,播放器将不采取任何行动。
        播放器的播放速度不会改变,其currentItem不会改变,其currentTime
        将会随着时间的推移而不断地增加或减少。
        */
        AVPlayerActionAtItemEndNone     = 2,
    };
    

    AVPlayerTimeControl分类方法

    - (CMTime)currentTime; 当前时间

    ///获取当前播放时间信息
    CMTime time =  [self.player currentTime];
    /*
    CMTimeGetSeconds(time) 获取播放到了多少时长
    */
    NSLog(@"当前播放到的时间节点 = %f",CMTimeGetSeconds(time));
    

    - (void)seekToDate:(NSDate *)date; //跳转到某一时间

    - (void)seekToDate:(NSDate *)date completionHandler:(void (^)(BOOL finished))completionHandler

    - (void)seekToTime:(CMTime)time 跳转到某一个时间

    - (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter 精确的跳转到某一个时间节点

    当创建隐式AVPlayItem时,想要获取视频时长, 可以监听 status, 当status为AVPlayerStatusReadyToPlay可以获取时长

    AVPlayerItem *item = [self.player currentItem];
    Float64  totalSeconds =  CMTimeGetSeconds(item.duration);
    

    - (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block; 监听播放进度

    目前写到官方文档第200行,记录,下次接着写

    相关文章

      网友评论

          本文标题:AVFoundation框架解析(一)AVPlayer

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