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;
当status
为AVPlayerStatusFailed
时, 可以通过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行,记录,下次接着写
网友评论