2012-03-15 6 views
0

В моем приложении я должен сразу воспроизвести первое видео, а затем воспроизвести второе видео, которое будет повторяться. Итак, сначала я использовал MPMoviePlayerController, но уже был черный экран между двумя видео. Итак, я где-то читал, что в моем случае я должен использовать AVFoundation. Вот почему я использую AVQueuePLayer с двумя AVPLayerItem, которые я создаю с помощью моего NSURL. Но проблема в том, что после первого видео завершена длительная пауза. Почти в течение 0,5 секунд, прежде чем начнется вторая запись o. Как удалить его? Какой способ использования? Итак, я очень ценю любую помощь! Мне это очень нужно, как можно скорее. Благодаря!Воспроизведение двух видеороликов в последовательности с любым промежутком или паузой между ними в iOS 5

Здесь все мои методы, которые я использую:

- (void) configureAVPlayer { 
    self.queuePlayer.actionAtItemEnd = AVPlayerActionAtItemEndPause; 

    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(playerItemDidReachEnd:) 
     name:AVPlayerItemDidPlayToEndTimeNotification 
     object:self.queuePlayer]; 

    self.isFirstVideoFinished = NO; 

    [self playVideos]; 

}

- (void) playVideos { 
    [self setPlayerItemsForQueue]; 
    [self.videoHolder setPlayer:self.queuePlayer]; 

}

- (void) setPlayerItemsForQueue { 
NSURL *fileURL = [[NSBundle mainBundle] 
        URLForResource:[self getStringForMode:self.currentMode] withExtension:@"mp4"]; 

NSMutableString *secondFile = [self getStringForMode:self.currentMode]; 
[secondFile appendString:@"Second"]; 
NSURL *secondFileUrl = [[NSBundle mainBundle] URLForResource:secondFile withExtension:@"mp4"]; 

AVAsset *firstAsset = [AVAsset assetWithURL:fileURL]; 

AVPlayerItem *firstVideoItem = [AVPlayerItem playerItemWithAsset:firstAsset];//[AVPlayerItem playerItemWithURL:fileURL]; 

AVAsset *secondAsset = [AVAsset assetWithURL:secondFileUrl]; 
AVPlayerItem *secondVideoItem = [AVPlayerItem playerItemWithAsset:secondAsset];//[AVPlayerItem playerItemWithURL:secondFileUrl]; 

self.queuePlayer = [AVQueuePlayer queuePlayerWithItems: [NSArray arrayWithObjects:firstVideoItem, secondVideoItem,nil]]; 

for (AVPlayerItem *playerItem in self.queuePlayer.items) { 
    [playerItem addObserver: self forKeyPath: @"status" options:0 context:NULL]; 
} 

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
        change:(NSDictionary *)change context:(void *)context { 

dispatch_async(dispatch_get_main_queue(), ^{ 
    if ([(AVPlayerItem *)object status] == AVPlayerItemStatusReadyToPlay) { 
     [self.queuePlayer play]; 
    } 
}); 

}

- (void) playerItemDidReachEnd:(NSNotification*) notification { 

NSMutableString *secondFile = [self getStringForMode:self.currentMode]; 
[secondFile appendString:@"Second"]; 
NSURL *secondFileUrl = [[NSBundle mainBundle] URLForResource:secondFile withExtension:@"mp4"]; 
AVPlayerItem *playerItem = [[ AVPlayerItem alloc ] initWithURL:secondFileUrl]; 

if ([self.queuePlayer canInsertItem:playerItem afterItem:[notification object]]) { 
    [self.queuePlayer insertItem: playerItem afterItem: nil ]; 
} 

}

ответ

0

Да, несколько объектов AVPlayer являются лучшим вариантом.

Я решил эту проблему с помощью функции главного таймера, которая контролировала текущее время воспроизведения firstVideoItem, а когда было 0,01 секунды с конца, я бы перевернул игроков на альфа-канале, поэтому secondVideoItem был виден, а затем сыграл secondVideoItem ,

Я также использовал [secondVideoItem seekToTime: CMTimeMakeWithSeconds (1,1)] перед выдачей команды воспроизведения, чтобы убедиться, что второе видео было инициализировано и готово к воспроизведению. Это очень помогло.