Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用AVFoundation在视频之间快速切换_Ios_Video_Avfoundation_Avplayer - Fatal编程技术网

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

Ios 使用AVFoundation在视频之间快速切换,ios,video,avfoundation,avplayer,Ios,Video,Avfoundation,Avplayer,我正在编写一个应用程序,用户可以录制多达6个视频剪辑,每个视频剪辑的持续时间为2秒。录制视频剪辑时,用户可以使用6个按钮播放视频剪辑-每个剪辑一个按钮。然后,用户可以通过在6个剪辑之间切换来录制电影。问题是,当用户按下按钮时,我需要在6个剪辑之间进行近乎即时的切换——否则,播放剪辑的幻觉就会消失——该功能与应用商店中名为CamBox的应用程序有些相似 我第一次尝试在用户每次按下按钮时在AVPlayer中用和AVAsset初始化AvPlayerItem中的每个剪辑。在我的主视图中,播放器的输出直接

我正在编写一个应用程序,用户可以录制多达6个视频剪辑,每个视频剪辑的持续时间为2秒。录制视频剪辑时,用户可以使用6个按钮播放视频剪辑-每个剪辑一个按钮。然后,用户可以通过在6个剪辑之间切换来录制电影。问题是,当用户按下按钮时,我需要在6个剪辑之间进行近乎即时的切换——否则,播放剪辑的幻觉就会消失——该功能与应用商店中名为CamBox的应用程序有些相似

我第一次尝试在用户每次按下按钮时在AVPlayer中用和AVAsset初始化AvPlayerItem中的每个剪辑。在我的主视图中,播放器的输出直接指向AVPlayerLayer。问题是加载和开始播放所需的时间相当长,这意味着当用户连续快速按下按钮时,视频延迟

我决定尝试使用5个AVPlayers和5个avplayerlayer预加载所有剪辑。5个播放器层被插入到我的主视图中,当用户按下按钮时,当前正在播放的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;
  }    
}
我确信4个预装视频剪辑的限制是硬件限制,但替代方案是什么。有人有什么想法吗?
提前感谢。

请参阅我的答案,它显示了一个可用于实现此逻辑的库,以及一个带有3个按钮的示例应用程序,用于启动动画剪辑。每个剪辑还具有相关的音效。

这6个剪辑是否按任意顺序播放?不,不完全是-用户通过按随机顺序的6个按钮来决定。我没有使用动画ImageView模拟视频,虽然它需要一些额外的代码,但效果还可以。是否允许用户按任何顺序按下任何按钮?或者,一旦按下一个按钮,用户只能按下剩余的5个按钮,然后是4个按钮,依此类推?在哪里可以找到更好的解决方案?我正在做类似的事情,发现了同样的问题。。。
- (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;    
}