使用AVFoundation在video之间快速切换

我正在编写一个应用程序,用户可以logging多达6个video剪辑,每个video剪辑持续2秒。 录制video剪辑时,用户可以使用6个button进行播放,每个剪辑一个。 用户可以通过在6个剪辑之间切换来录制电影。 问题是,当用户按下button时,我需要在6个剪辑之间进行近乎瞬时的切换 – 否则播放剪辑的错觉就会丢失 – function与App Store中名为CamBox的应用有些类似。

我每次用户按下一个button时,首先尝试用AVPlayer中的AVPlayerItem和AVAsset初始化每个剪辑。 玩家的输出是在我的主视图中的一个AVPlayerLayer。 问题在于加载和开始播放的时间很长,这意味着当用户连续按下button时,video滞后。

我决定尝试使用5个AVPlayers和5个AVPlayerLayer预加载所有剪辑。 5 PlayerLayers被插入到我的主视图,当用户按下一个button,当前正在播放的AVPlayer暂停和倒带,当前可见的AVPlayerLayer被隐藏。 新的AVPlayer启动,并显示相应的AVPlayerLayer。 它的工作原理相当好,虽然不是瞬间的,但比我的第一个解决scheme快得多,但问题是我只能预加载4个剪辑,而不是当用户按下最后两个button时,它会拖延大时间。 以下是我的预加载剪辑的代码

-(void)loadVideos { layers = [[NSMutableArray alloc] initWithCapacity:6]; players = [[NSMutableArray alloc] initWithCapacity:6]; for(int i = 1; i < 7; i++) { NSURL* fileURL = [NSURL fileURLWithPath:[self getFileName:i]]; AVPlayerItem* avPlayerItem = [[[AVPlayerItem alloc] initWithURL:fileURL] autorelease]; [avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil]; AVPlayer *avPlayer = [[[AVPlayer alloc] initWithPlayerItem:avPlayerItem] autorelease]; [avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; [avPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:nil]; AVPlayerLayer* layer = [AVPlayerLayer playerLayerWithPlayer:avPlayer]; layer.frame = self.playerView.bounds; [playerView.layer addSublayer:layer]; [layers addObject:layer]; [players addObject:avPlayer]; layer.hidden = YES; } } 

6个button的事件处理程序如下所示:

 - (IBAction)takeBtnClicked:(id)sender { int tag = ((UIButton*)sender).tag; AVPlayer* player; AVPlayerLayer* layer; if (layerIndex > -1) { player = [players objectAtIndex:layerIndex]; layer = [layers objectAtIndex:layerIndex]; [player pause]; layer.hidden = YES; [player seekToTime:kCMTimeZero]; } layerIndex = tag-1; player = [players objectAtIndex:layerIndex]; layer = [layers objectAtIndex:layerIndex]; [player play]; layer.hidden = NO; } 

我很确定4个预装的video剪辑的限制是硬件限制,但是替代scheme是什么。 有人有什么想法吗? 提前致谢。

看到我的答案, 从一个video到另一个iPhone平滑过渡 ,它显示了一个库,你可以用来实现这个逻辑和一个示例应用程序与3个button启动animation剪辑。 每个剪辑也有相关的声音效果。