Objective c AVPlayer跳过视频的开头
我有一个问题,AVPlayer跳过了我正在播放的视频的前0.5秒,当我尝试在预滚动后立即播放它 首先,我创建播放器:Objective c AVPlayer跳过视频的开头,objective-c,ios,avfoundation,avplayer,Objective C,Ios,Avfoundation,Avplayer,我有一个问题,AVPlayer跳过了我正在播放的视频的前0.5秒,当我尝试在预滚动后立即播放它 首先,我创建播放器: self.videoPlayer = [[AVPlayer alloc] init]; -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ ... if (context ==
self.videoPlayer = [[AVPlayer alloc] init];
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
if (context == kBLVideoPlayerStatusContext) {
if ([self.videoPlayer status] == AVPlayerStatusReadyToPlay) {
[self.videoPlayer removeObserver:self forKeyPath:@"status" context:&kBLVideoPlayerStatusContext];
[self prerollVideoPlayer];
}
}
...
-(void)prerollVideoPlayer{
[self.videoPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
if (finished) {
[self.videoPlayer play];
}
}];
}
然后,我将播放器项添加到播放器中,并添加一个观察者来检查并查看该项何时准备就绪:
[self.videoPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:kBLCurrentPlayerItemStatusContext];
[self.videoPlayer replaceCurrentItemWithPlayerItem:self.currentVideoPlayerItem];
当观察到玩家物品时,我会检查玩家是否准备好玩。如果它还没有准备好玩,我将添加一个观察者以确保它准备好玩:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
} else if (context == kBLCurrentPlayerItemStatusContext) {
[self.videoPlayer removeObserver:self forKeyPath:@"currentItem" context:&kBLCurrentPlayerItemStatusContext];
if ([self.videoPlayer status]==AVPlayerStatusReadyToPlay) {
[self prerollVideoPlayer];
} else {
[self.videoPlayer addObserver:self forKeyPath:@"status" options:0 context:&kBLVideoPlayerStatusContext];
}
}
...
当观察到玩家状态为“准备好玩”时,我会对玩家进行预滚:
self.videoPlayer = [[AVPlayer alloc] init];
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
if (context == kBLVideoPlayerStatusContext) {
if ([self.videoPlayer status] == AVPlayerStatusReadyToPlay) {
[self.videoPlayer removeObserver:self forKeyPath:@"status" context:&kBLVideoPlayerStatusContext];
[self prerollVideoPlayer];
}
}
...
-(void)prerollVideoPlayer{
[self.videoPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
if (finished) {
[self.videoPlayer play];
}
}];
}
预滚完成后,我将扮演玩家:
self.videoPlayer = [[AVPlayer alloc] init];
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
if (context == kBLVideoPlayerStatusContext) {
if ([self.videoPlayer status] == AVPlayerStatusReadyToPlay) {
[self.videoPlayer removeObserver:self forKeyPath:@"status" context:&kBLVideoPlayerStatusContext];
[self prerollVideoPlayer];
}
}
...
-(void)prerollVideoPlayer{
[self.videoPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
if (finished) {
[self.videoPlayer play];
}
}];
}
当播放器以这种方式播放时,它会跳过视频的前~0.5秒。如果我没有让玩家在完成预滚后立即进行播放,并且我稍后调用播放方法,则播放效果良好。我已经检查以确保所有观察者都被正确地观察到,并且它们按照我上面提到的顺序出现。是否需要添加其他观察者或检查通知以避免这种跳过行为 您正在背靠背播放多个视频吗?我这样问是因为您正在呼叫replaceCurrentItemWithPlayerItem。在我使用AVPlayer的经验中,我看到调用replaceCurrentItemWithPlayerItem与杀死当前的AVPlayer并创建一个新的AVPlayer时,它的行为有着显著的不同。谢谢你的提示。我试过了,但我也有同样的行为。我想这和游戏有关。即使我复制相同的playerItem并将其重新加载到播放器中,我仍然会得到相同的延迟。我也尝试过观察playerItem的状态,确保它可以在播放器之外播放,但这也没有帮助。我只是在视频中添加了一个音频曲目。有趣的是,我的视频的音频将立即播放,但它跳过的部分只是视频。我只在头0.5秒看到一个黑屏。但是音乐播放正确。听起来你正在经历的延迟似乎是由于播放器自己进行内部缓冲造成的。您是否尝试过流式传输较低质量的视频以查看延迟是否较少?您解决过这个问题吗?