AVPlayerItem replaceCurrentItemWithPlayerItem阻塞(AV

2019-07-18 22:29发布

首先关于应用一点背景知识...
- 有很多的重型UI操作的包括视频播放器(主要是滚动)
- 这些视频基于我们当前的页面是动态的,变化的。
- 让视频的必须是动态的,不断变化,也是UI需要响应

我最初使用MPMoviePlayerController但随后由于有一定的要求,我不得不求助于AVPlayer
我做了我自己的包装为AVPlayer
要在录像机这一变化的内容是什么方法看起来像在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];
}

现在,ofcourse一切工作正常......除了..

[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];

似乎阻止了该UI用于几分之一秒和滚动这些期间使UI真的响应,并且也难看不能在后台执行该操作

有没有这方面的任何修订或变通方法..?

Answer 1:

我找到的解决方案是确保底层AVAsset是准备返回基本信息,比如它的持续时间,将其送入前AVPlayerAVAsset有一个方法loadValuesAsynchronouslyForKeys:这是非常方便的这样的:

AVAsset *asset = [AVAsset assetWithURL:self.mediaURL];
[asset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
    AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:asset];
    [self.avPlayer replaceCurrentItemWithPlayerItem:newItem];
}];

在我的案件的网址是网络资源, replaceCurrentItemWithPlayerItem:实际上会阻止几秒钟等待这个信息,否则下载。



Answer 2:

建设Ultravisual时,我们有同样的问题。 我不能确切记得我们是如何解决它,但IIRC它参与做尽可能多的项目设置尽可能在后台线程,并等待,直到新的项目报告说,它是“准备玩”打电话之前replaceCurrentItemWithPlayerItem

可悲的是,这涉及与有些不一致异步志愿,这是没有什么好玩的巫术舞。



文章来源: AVPlayerItem replaceCurrentItemWithPlayerItem Blocking