Быстрое переключение между видео с помощью AVFoundation - PullRequest
5 голосов
/ 13 сентября 2011

Я пишу приложение, в котором пользователь может записать до 6 видеоклипов, каждый продолжительностью 2 секунды.Когда видеоклипы записаны, пользователь может воспроизводить их с помощью 6 кнопок - по одной для каждого клипа.Затем пользователь может записать фильм, переключаясь между 6 клипами.Проблема в том, что мне нужно почти мгновенное переключение между 6 клипами, когда пользователь нажимает кнопку - в противном случае иллюзия игры с клипами теряется - функциональность чем-то похожа на приложение под названием CamBox в App Store.

Сначала я пытался инициализировать каждый клип с помощью AVAsset в AvPlayerItem в AVPlayer каждый раз, когда пользователь нажимал кнопку.Вывод плеера был направлен на слой AVPlayer в моем главном окне.Проблема в том, что время, необходимое для загрузки и начала воспроизведения, достаточно велико, то есть видео отстает, когда пользователь нажимает кнопки в быстрой последовательности.

Я решил попробовать предварительно загрузить все клипы, используя 5 AVPlayer и 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 предварительно загруженных видеоклиповэто аппаратное ограничение, но какова альтернатива.У кого-нибудь есть идеи?Заранее спасибо.

1 Ответ

0 голосов
/ 18 июня 2013

См. Мой ответ для iphone-smooth-transition-from-one-video-to-other , он показывает библиотеку, которую вы можете использовать для реализации этой логики, и пример приложения с 3 кнопками, которые запускаются анимированные клипы. Каждый клип также имеет связанный звуковой эффект.

...