AVQueuePlayer播放没有间隙和冻结

我使用AVQueuePlayer播放从URL加载的电影序列。
我尝试使用所有需要播放的AVPlayerItems数组初始化播放器实例。

 player = [[AVQueuePlayer queuePlayerWithItems:playerItemsArray] 

但在这种情况下, AVQueuePlayer会在开始播放之前加载每个AVPlayerItem一些初始部分。 它会导致令人沮丧的冻结,并且应用程序在几秒钟内不响应。

有可能只添加第一个AVPLayerItem到播放器的队列中,观察它的状态,并且只在第一个播放到达结束时才在队列中添加第二个播放项,但在这种情况下,由第二个AVPlayerItem初始化和缓冲。

有没有办法组织无缝播放的几个video没有冻结?
我是否应该使用其他玩家来达到这个目的?

提前致谢。

find解决scheme。

AVQueuePlayer播放器的队列中添加新的AVPlayerItem将同步等待,直到播放器项目的初始部分将被caching。

所以在这种情况下,玩家项目应该被asynchronous缓冲,之后它可以被添加到队列中。
可以使用[AVURLAsset loadValuesAsynchronouslyForKeys: completionHandler:]

例如:

 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; NSArray *keys = [NSArray arrayWithObject:@"playable"]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { dispatch_async(dispatch_get_main_queue(), ^ { AVPlayerItem *playerItem = [[[AVPlayerItem alloc] initWithAsset:asset] autorelease]; [player insertItem:playerItem afterItem:nil]; }); }]; 

使用AVQueuePlayer的解决scheme队列可以填充项目,没有任何间隙和冻结。

在Swift 2中,在这里工作:

 func load() { let player = AVQueuePlayer() for url in urls { makeItem(url) } } func makeItem(url: String) { let avAsset = AVURLAsset(URL: NSURL(string: url)!) avAsset.loadValuesAsynchronouslyForKeys(["playable", "tracks", "duration"], completionHandler: { dispatch_async(dispatch_get_main_queue(), { self.enqueue(avAsset: avAsset) }) }) } func enqueue(avAsset: AVURLAsset) { let item = AVPlayerItem(asset: avAsset) self.player.insertItem(item, afterItem: nil) } 

这是解决scheme。

 - (void)_makePlayer{ _player = [[AVQueuePlayer alloc] initWithPlayerItem:[AVPlayerItem playerItemWithAsset:[SSMoviePreviewItemMaker generateAVMovieItem]]]; } + (AVAsset *)generateAVMovieItem{ NSArray * array = [SSMovieFileManager getAllMovieResourceURL]; AVMutableComposition *composition = [[AVMutableComposition alloc] init]; for (int i = 0; i < array.count; i++) { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:array[i] options:nil]; [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofAsset:asset atTime:composition.duration error:nil]; } return composition; }