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) } }