AVQueuePlayer无间隙播放和冻结

yur*_*.ku 10 objective-c avfoundation ios avqueueplayer

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

player = [[AVQueuePlayer queuePlayerWithItems:playerItemsArray]
Run Code Online (Sandbox Code Playgroud)

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

有可能只添加第一个AVPLayerItem到玩家的队列,观察它的状态并且只在第一个到达结束时在队列中添加第二个项目,但是在这种情况下,由于初始化和缓冲第二个项目而导致两个项目的回放之间存在间隙AVPlayerItem.

有没有办法在没有冻结的情况下组织几个视频的无间隙播放?
我应该为此目的使用其他玩家吗?

提前致谢.

yur*_*.ku 17

找到解决方案.

当添加新AVPlayerItem的队列中的AVQueuePlayer玩家将同步等待玩家项目的初始部分将被缓冲.

因此,在这种情况下,播放器项应该异步缓冲,然后可以将其添加到队列中.
它可以使用[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]; 
    });

}];
Run Code Online (Sandbox Code Playgroud)

使用AVQueuePlayer的此解决方案队列可以填充没有任何间隙和冻结的项目.

  • 您好yury.ku,我们有同样的问题你发布了什么.我们创建了一个示例应用来测试它.我们在didEndPlay:notification API中加载新玩家项目后添加它.但我们仍面临一些UI冻结问题.您能否提供更多关于如何解决这个问题的信息? (4认同)
  • 这个解决方案对我来说也不起作用,音轨之间的差距仍然很小 (4认同)
  • 根据 [AVFoundation 编程指南](https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW3) :`尝试使用 URL 初始化 AVURLAsset,然后加载其轨道键。如果轨道加载成功,那么您将为资产创建一个播放器项目。`. 所以,你应该使用`NSArray *keys = [NSArray arrayWithObject:@"tracks"];`代替。 (2认同)
  • 这"有效",但没有考虑到某些资产可能比其他资产加载速度更快的可能性,因此无法保证插入它们的顺序.如何保持播放顺序? (2认同)