1.跳过片头:
KVO监听AVPlayerItem的status,当状态为AVPlayerItemStatusReadyToPlay时,seek到片头结束。
NSURL*url = ;
AVAsset*asset = [AVAsset assetWithURL:url];
AVPlayerItem*playItem = [AVPlayerItem playerItemWithAsset:asset];
[playItem addObserver:self forKeyPath:@"status"options:0context:nil];
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
if([keyPath isEqualToString:@"status"]) {
AVPlayerItem*playItem = object;
if(playItem.status==AVPlayerItemStatusReadyToPlay){
CMTime time ;//片头结束时的时间
[self.player seekToTime:time];
[playItem removeObserver:selfforKeyPath:@"status"];//移除监听
}
}
}
2.跳过片尾
跳过片尾需要用到AVPlayer的一个边界时间监听的方法:
-(id)addBoundaryTimeObserverForTimes:(NSArray *)times queue:(nullable dispatch_queue_t)queue usingBlock:(void(^)(void))block;
对这个方法传递一个时间数组,player会在播放到指定时间后回调这个block。
有三个参数:
times :一个由CMTime组成的时间数组,用于标记边界时间。
queue : 监听的调度队列,设为空时为默认为主队列。
block :监听的回调代码块。block中没有明确是哪个时间的调用,需要自己计算。
CMTime time ;//正片结束时间
NSValue timeValue = [NSValue valueWithCMTime:time];
[self.player addBoundaryTimeObserverForTimes:@[timeValue]queue:nil usingBlock:^{
//执行相应操作,如果是使用的AVQueuePlayer,直接播放下一个资源
[seakSelf.player advanceToNextItem];
}];
}