使用AVFoundation在视频之间快速切换

bla*_*ool 5 video avfoundation ios avplayer

我正在编写一个应用程序,用户最多可以录制6个视频片段,每个片段的持续时间为2秒.当录制视频剪辑时,用户可以使用6个按钮进行播放 - 每个剪辑一个.然后,用户可以通过在6个剪辑之间切换来录制电影.问题是,当用户按下按钮时,我需要在6个剪辑之间进行近乎瞬时的切换 - 否则会丢失播放剪辑的错觉 - 该功能有点类似于App Store中名为CamBox的应用程序.

每当用户按下按钮时,我首先尝试使用AVPlayer中的AvPlayerItem和AVAsset初始化每个剪辑.播放器的输出在我的主视图中指向AVPlayerLayer.问题是加载和开始播放所花费的时间很长,这意味着当用户快速连续按下按钮时视频会滞后.

我决定尝试使用5个AVPlayers和5个AVPlayerLayers预加载所有剪辑.5 PlayerLayers被插入到我的主视图中,当用户按下按钮时,当前正在播放的AVPlayer被暂停和倒回,并且当前可见的AVPlayerLayer被隐藏.启动新的AVPlayer并显示相应的AVPlayerLayer.它工作得比我的第一个解决方案快得多,虽然不是瞬间但问题是我只能预加载4个剪辑,这意味着当用户按下播放最后两个按钮的按钮时,它会滞后很长时间.下面是我预加载剪辑的代码

-(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;
  }    
}
Run Code Online (Sandbox Code Playgroud)

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

- (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;    
}
Run Code Online (Sandbox Code Playgroud)

我确信4个预装视频剪辑的限制是硬件限制,但是替代方案是什么.有人有什么想法吗?提前致谢.

MoD*_*oDJ 0

请参阅我对iphone-smooth-transition-from-one-video-to-another 的回答,它显示了一个可用于实现此逻辑的库以及一个带有 3 个启动动画剪辑的按钮的示例应用程序。每个剪辑还具有相关的声音效果。