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