使用AVFoundation快速切换视频

6
我正在编写一个应用程序,用户可以录制最多6个视频片段,每个片段长度为2秒。当用户录制完毕后,可以使用6个按钮播放这些片段。然后用户可以通过在这6个片段之间切换来录制电影。问题是,当用户按下按钮时,我需要近乎即时地在这6个片段之间切换,否则就会失去与片段玩耍的错觉。这个功能与App Store中的CamBox应用程序有点类似。
我首先尝试了每次用户按下按钮时,使用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;
  }    
}

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

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


这6个剪辑以任何顺序播放吗? - Stephen Hsu
不是真的 - 用户通过随机按六个按钮来决定。我没有使用动画ImageView模拟视频,虽然这需要一些额外的代码,但它可以正常工作。 - blackpool
用户可以按任意顺序按下任何按钮吗?还是例如一旦按下一个按钮,用户只能按下剩余的5个,然后是4个,以此类推? - superjos
你能找到更好的解决方案吗?我正在做类似的事情,也遇到了同样的问题... - Pedro Mancheno
1个回答

0
请看我的回答iphone-smooth-transition-from-one-video-to-another,它展示了一个库,您可以使用它来实现这个逻辑,并且还有一个具有3个按钮的示例应用程序,可以启动动画片段。每个剪辑还带有关联的声音效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接