在iOS开发的道路上越走越远iOS知识收录iOS

AVPlayer视频播放之 - AVPlayer

2017-12-05  本文已影响2530人  寻形觅影

AVPlayer是驱动播放用例的中心阶层,是用于管理媒体资产的回放和定时的控制器对象。它提供了控制播放器传输行为的界面,例如播放,暂停,改变播放速度的能力,以及在媒体时间线内寻找各个时间点的能力,主要使用一个AVPlayer播放本地和远程基于文件的媒体。AVPlayer一次只能播放一个媒体资源。播放器可以使用其- (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item方法被重新使用来播放额外的媒体资产,但是它一次只管理单个媒体资产的播放。该框架还提供了一个 AVQueuePlayer 子类,该类可以使用来创建和管理媒体资产的队列,以便按顺序播放。

typedef NS_ENUM(NSInteger, AVPlayerStatus) {
    AVPlayerStatusUnknown, //表示播放器的状态尚未知道,因为它尚未尝试加载新的媒体资源
    AVPlayerStatusReadyToPlay, // 表示播放器已准备好播放AVPlayerItem实例
    AVPlayerStatusFailed // 表示播放器由于错误而不能再播放AVPlayerItem实例
};

-@property (nonatomic, readonly) BOOL outputObscuredDueToInsufficientExternalProtection由于外部保护不足,解码输出是否被遮蔽,指因为当前设备配置不满足外部保护机制的要求,播放器是否有意模糊当前项目的视觉输出。可观察属性;

播放控制相关⏬

 下面一些属性在iOS 10之后才可以使用:
typedef NS_ENUM(NSInteger, AVPlayerTimeControlStatus) {
    /**
    当播放`rate`变为0.0时,进入此状态.此更改可能是调用`pause`方法或
    更改播放的`rate`属性为0.0的结果,但也可能由于外部事件(如iOS中断)
    而发生。在这种状态下,播放会无限期地暂停,直到播放速率变为大于0.0的
    值: 接收到具有非零值的-setRate:或-playImmediatelyAtRate:,
    并且有足够的媒体数据已被缓冲以进行播放为止。
    */
    AVPlayerTimeControlStatusPaused, 

   /**
    当播放器在AVPlayerTimeControlStatusPlaying状态下因为播放缓冲器
    变空而播放停止时或者在AVPlayerTimeControlStatusPaused状态下,播
    放速度从0.0被设置为其他值但是并没有足够的媒体数据已经被缓冲可以用来进
    行播放时或者播放器没有Item去进行播放时,即player的currentItem为nil
    时会进入此状态。在等待缓冲时,可以尝试通过 -playImmediatelyAtRate: 
    方法开始播放任何其他可用的媒体数据。
    */
    AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate,

   /**
    在这种状态下,播放正在进行,速率(rate)的更改将立即生效。 如果因为媒体
    数据不足而播放失败,则timeControlStatus的属性值将更改为
    AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate
    */
    AVPlayerTimeControlStatusPlaying

} NS_ENUM_AVAILABLE(10_12, 10_0);

// 官方示例:
- (void)addPeriodicTimeObserver {
    // Invoke callback every half second
    CMTime interval = CMTimeMakeWithSeconds(0.5, NSEC_PER_SEC);
    // Queue on which to invoke the callback
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // Add time observer
    self.timeObserverToken =
        [self.player addPeriodicTimeObserverForInterval:interval
                                                  queue:mainQueue
                                             usingBlock:^(CMTime time) {
                                                 // Use weak reference to self
                                                 // Update player transport UI
                                             }];
}
// 官方示例:
- (void)addBoundaryTimeObserver {
    NSMutableArray *times = [NSMutableArray array];

    // Set initial time to zero
    CMTime currentTime = kCMTimeZero;
    // Get asset duration
    CMTime assetDuration = self.asset.duration;
    // Divide the asset duration into quarters
    CMTime interval = CMTimeMultiplyByFloat64(assetDuration, 0.25);
 
    // Build boundary times at 25%, 50%, 75%, 100%
    while (CMTIME_COMPARE_INLINE(currentTime, <, assetDuration)) {
        currentTime = CMTimeAdd(currentTime, interval);
        [times addObject:[NSValue valueWithCMTime:currentTime]];
    }
    // Add time observer
    self.timeObserverToken =
        [self.player addBoundaryTimeObserverForTimes:times
                                               queue:dispatch_get_main_queue()
                                          usingBlock:^{
                                              // Use weak reference to self
                                              // Update user interface state
        }];
}
// 官方示例
- (void)removeBoundaryTimeObserver {
    if (self.timeObserverToken) {
        [self.player removeTimeObserver:self.timeObserverToken];
        self.timeObserverToken = nil;
    }
}

配置媒体选择标准设置⏬

外部播放支持相关⏬

将播放同步到外部源⏬

 这类方法仅适用于基于文件的播放,暂时不支持HLS(HTTP Live Streaming)的设置。

与AVPlayerItem相关⏬

typedef NS_ENUM(NSInteger, AVPlayerActionAtItemEnd)
{
    /**
    指示当AVPlayerItem达到其结束时间时,播放器将自动前进到其
    队列中的下一个项目。此值仅支持AVQueuePlayer类的播放器。
    如果对非AVQueuePlayer类设置此值则会发生异常。
    */
    AVPlayerActionAtItemEndAdvance  = 0,

    /**
     播放完成后自动将rate设置为0.0使视频暂停。
    */
    AVPlayerActionAtItemEndPause    = 1,

    /**
    表示当AVPlayerItem达到其结束时间时,播放器将不采取任何行动。
    播放器的播放速度不会改变,其currentItem不会改变,其currentTime
    将会随着时间的推移而不断地增加或减少。
    */
    AVPlayerActionAtItemEndNone     = 2,
};

AVQueuePlayer子类

AVPlayerLayer相关

typedef NSString * AVLayerVideoGravity NS_STRING_ENUM;
/**
保留宽高比的情况下,尽量适合layer的bounds。
*/
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResizeAspect
/**
保留宽高比的情况下,完全填充layer的bounds。
*/
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResizeAspectFill
/**
拉伸填充满layer的bounds。
*/
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResize
// 官方示例
// PlayerView.h
@interface PlayerView : UIView
@property AVPlayer *player;
@property (readonly) AVPlayerLayer *playerLayer;
@end
 
// PlayerView.m
@implementation PlayerView
- (AVPlayer *)player {
    return self.playerLayer.player;
}
 
- (void)setPlayer:(AVPlayer *)player {
    self.playerLayer.player = player;
}
 
// Override UIView method
+ (Class)layerClass {
    return [AVPlayerLayer class];
}
 
- (AVPlayerLayer *)playerLayer {
    return (AVPlayerLayer *)self.layer;
}
@end
上一篇 下一篇

猜你喜欢

热点阅读