AVPlayer在开始缓冲audiostream时“冻结”应用程序

我正在使用AVQueuePlayer一个子类,当我用streamURL添加新的AVPlayerItem ,应用程序冻结了一两秒钟。 通过冻结我的意思是,它不响应用户界面的触摸。 另外,如果我已经播放了一首歌曲,然后再添加一首歌曲, AVQueuePlayer自动开始预加载该歌曲,同时它仍然是第一个播放歌曲。 这使得应用程序不响应在界面上触摸两秒钟,就像添加第一首歌曲但歌曲仍在播放一样。 所以这意味着AVQueuePlayer正在主线程中做某些事情,导致明显的“冻结”。

我正在使用insertItem:afterItem:添加我的AVPlayerItem 。 我testing了一下,确定这是造成延迟的方法。 也许这可能是AVPlayerItem在将其添加到队列时被AVQueuePlayer激活时所做的事情。

必须指出的是,我正在使用Dropbox API v1testing版通过使用此方法调用来获取stream式URL:

 [[self restClient] loadStreamableURLForFile:metadata.path]; 

然后,当我收到streamURL,我发送到AVQueuePlayer如下:

 [self.player insertItem:[AVPlayerItem playerItemWithURL:url] afterItem:nil]; 

所以我的问题是:我如何避免这种情况? 我应该在没有AVPlayer帮助的情况下自行预先加载audiostream吗? 如果是这样,我该怎么做?

谢谢。

不要使用playerItemWithURL它是同步的。 当你收到这个url的回应时,试试这个:

 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; NSArray *keys = @[@"playable"]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { [self.player insertItem:[AVPlayerItem playerItemWithAsset:asset] afterItem:nil]; }]; 

Gigisommo对Swift 3的回答包括评论的反馈:

 let asset = AVAsset(url: url) let keys: [String] = ["playable"] asset.loadValuesAsynchronously(forKeys: keys) { DispatchQueue.main.async { let item = AVPlayerItem(asset: asset) self.playerCtrl.player = AVPlayer(playerItem: item) } }