Iphone AVPlayerItem使用PlayerItem块替换CurrentItem
首先是关于应用程序的一些上下文…Iphone AVPlayerItem使用PlayerItem块替换CurrentItem,iphone,ios,ipad,mpmovieplayercontroller,avplayer,Iphone,Ios,Ipad,Mpmovieplayercontroller,Avplayer,首先是关于应用程序的一些上下文… -有很多繁重的用户界面操作涉及视频播放器(主要是滚动) -视频是动态的,并根据当前页面进行更改。 -因此,视频必须是动态的,不断变化,用户界面也需要响应 我最初使用的是MPMoviePlayerController,但由于某些要求,我不得不转而使用AVPlayer 我为AVPlayer制作了自己的包装 要更改videoPlayer中的内容,这就是AVPlayer包装类中的方法 /**We need to change the whole playerItem e
-有很多繁重的用户界面操作涉及视频播放器(主要是滚动)
-视频是动态的,并根据当前页面进行更改。
-因此,视频必须是动态的,不断变化,用户界面也需要响应 我最初使用的是
MPMoviePlayerController
,但由于某些要求,我不得不转而使用AVPlayer我为
AVPlayer
制作了自己的包装要更改videoPlayer中的内容,这就是AVPlayer包装类中的方法
/**We need to change the whole playerItem each time we wish to change a video url */
-(void)initializePlayerWithUrl:(NSURL *)url
{
AVPlayerItem *tempItem = [AVPlayerItem playerItemWithURL:url];
[tempItem addObserver:self forKeyPath:@"status"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:nil];
[tempItem addObserver:self forKeyPath:@"playbackBufferEmpty"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:nil];
//Not sure if this should be stopped or paused under the ideal circumstances
//These will be changed to custom enums later
[self setPlaybackState:MPMoviePlaybackStateStopped];
[self setLoadState:MPMovieLoadStateUnknown];
[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];
//This is required only if we wish to pause the video immediately as we change the url
//[self.videoPlayer pause];
}
当然,现在一切都很好……除了
[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];
在滚动过程中,用户界面似乎被阻塞了几分之一秒,这使得用户界面变得毫无反应且丑陋,而且此操作无法在后台执行
是否对此有任何修复或解决方法 我们在构建Ultravisual时遇到了同样的问题。我记不清我们是如何解决的,但IIRC it涉及在后台线程上尽可能多地进行项目设置,并在调用
replaceCurrentItemWithPlayerItem
之前等待新项目报告它“准备好播放”
可悲的是,这涉及到一种巫毒舞蹈,带有一些不一致的异步KVO,这一点都不好玩。我找到的解决方案是确保底层的
AVAsset
在将其提供给AVPlayer
之前准备好返回基本信息,例如持续时间AVAsset
有一个方法LoadValuesAsSynchronouslyForkeys:
非常方便:
AVAsset *asset = [AVAsset assetWithURL:self.mediaURL];
[asset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:asset];
[self.avPlayer replaceCurrentItemWithPlayerItem:newItem];
}];
在我的例子中,URL是一个网络资源,
replaceCurrentItemWithPlayerItem:
实际上会阻塞几秒钟,等待下载此信息。您找到解决方案了吗?@AdrianDemetrescu-nope。。必须恢复到mpmovieplayerDid您尝试过这些建议吗?我没有,如果它真的起作用的话。。。你可以在这里发布修复我也被困在这里。。。有人吗?根据苹果文档,AVPlayer和AVPlayerItem的这些方法需要在主线程上调用。即使在获得信息(“持续时间”)之后在慢速网络中,它会在开始流媒体之前阻塞用户界面几秒钟。每个人都在谈论必须重新实现自己的AVPlayer,以便在UICollectionView中使用AVPlayer平滑滚动,但这是解决方案-只需在分配资源之前同步预加载LoadValues!我认为观察“可玩”键比观察“持续时间”更有意义。