Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AVPlayerItem使用PlayerItem块替换CurrentItem_Iphone_Ios_Ipad_Mpmovieplayercontroller_Avplayer - Fatal编程技术网

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!我认为观察“可玩”键比观察“持续时间”更有意义。