AVPlayer详解系列
首先在iOS平台使用播放视频,可用的选项一般有这四个,他们各自的作用和功能如下:
使用环境 优点 缺点
MPMoviePlayerController MediaPlayer 简单易用 不可定制
AVPlayerViewController AVKit 简单易用 不可定制
AVPlayer AVFoundation 可定制度高,功能强大 不支持流媒体
IJKPlayer IJKMediaFramework 定制度高,支持流媒体播放 使用稍复杂
一、AVPlayer的控制
前面讲过该类是控制视频播放行为的,他的使用比较简单。
播放视频:
[self.player play];
暂停视频:
[self.player pause];
更改速度:
self.player.rate = 1.5;//注意更改播放速度要在视频开始播放之后才会生效
2、视频的时间信息
在AVPlayer中时间的表示有一个专门的结构体CMTime
typedef struct{
CMTimeValue value; // 帧数
CMTimeScale timescale; // 帧率(影片每秒有几帧)
CMTimeFlags flags;
CMTimeEpoch epoch;
} CMTime;
CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。
获取当前播放时间,可以用value/timescale的方式:
float currentTime = self.playItem.currentTime.value/item.currentTime.timescale;
还有一种利用系统提供的方法,我们用它获取视频总时间:
float totalTime = CMTimeGetSeconds(item.duration);
如果我们想要添加一个计时的标签不断更新当前的播放进度,有一个系统的方法:
-
(id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block;
方法名如其意, “添加周期时间观察者” ,参数1 interal 为CMTime 类型的,参数2 queue为串行队列,如果传入NULL就是默认主线程,参数3 为CMTime 的block类型。
简而言之就是,每隔一段时间后执行 block。
比如:我们把interval设置成CMTimeMake(1, 10),在block里面刷新label,就是一秒钟刷新10次。
正常观察播放进度一秒钟一次就行了,所以可以这么写:
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:nil usingBlock:^(CMTime time) {AVPlayerItem *item = WeakSelf.playerItem;
NSInteger currentTime = item.currentTime.value/item.currentTime.timescale;
NSLog(@"当前播放时间:%ld",currentTime);
];