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