Как добавить переход между видео при использовании AVQueuePlayer?

Я работаю над видеоприложением, которое воспроизводит несколько видео одно за другим. Видео хранятся в массиве AVPlayerItems. AVQueuePlayer инициализируется этими AVPlayerItems и автоматически воспроизводит видео из этого массива.

Проблема в том, что когда он переключается на воспроизведение следующего видео, оно зависает на долю секунды или создает рывки во время перехода от одного к другому. Я хочу улучшить этот переход с помощью какой-нибудь анимации, такой как Fade In и Fade Out во время изменения видео.

Мой код для AVQueuePlayer:

AVQueuePlayer *mediaPlayer = [[AVQueuePlayer alloc] initWithItems:arrPlayerItems];
playerLayer=[AVPlayerLayer playerLayerWithPlayer:mediaPlayer];
playerLayer.frame=self.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.needsDisplayOnBoundsChange = NO;
[self.layer addSublayer:playerLayer];
self.layer.needsDisplayOnBoundsChange = YES;

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(itemPlayEnded:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:[mediaPlayer currentItem]];

Я попытался создать новый слой во время перехода и анимировать старый слой, уменьшив его непрозрачность и увеличив непрозрачность нового слоя (чтобы создать желаемый эффект плавного затухания), но это не работает должным образом.

Код пользовательского перехода:

-(void)TransitionInVideos {
    if (roundf(CMTimeGetSeconds(mediaPlayer.currentTime))==roundf(CMTimeGetSeconds(mediaPlayer.currentItem.duration))) {
        [self.layer addSublayer:playerLayerTmp];

        //Animation for the transition between videos
        [self performSelector:@selector(FadeIn) withObject:nil afterDelay:0.3];
        [self performSelector:@selector(FadeOut) withObject:nil afterDelay:0.3];
    }
}

-(void)FadeIn {
    CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
    fadeAnim.duration = 2.0;
    [playerLayer addAnimation:fadeAnim forKey:@"opacity"];
    [self performSelector:@selector(HideLayer) withObject:nil afterDelay:2.0];
}

-(void)FadeOut {
    CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = [NSNumber numberWithFloat:0.0];
    fadeAnim.toValue = [NSNumber numberWithFloat:1.0];
    fadeAnim.duration = 1.0;
    [playerLayerTmp addAnimation:fadeAnim forKey:@"opacity"];
    [self performSelector:@selector(ShowLayer) withObject:nil afterDelay:1.0];
}

-(void)HideLayer {
    playerLayer.opacity=0.0;
}

-(void)ShowLayer {
    playerLayerTmp.opacity=1.0;
}

Как применить переход к видео в AVQueuePlayer?


person Parvez Belim    schedule 07.11.2013    source источник
comment
Я хочу того же. Если вы нашли свое решение, напишите здесь. Это поможет другим.   -  person Anand Suthar    schedule 15.11.2013
comment
Apple предоставляет пример кода с использованием проигрывателя очереди с плавным переходом, если это помогает: developer.apple.com/library/content/samplecode/avloopplayer/   -  person iwasrobbed    schedule 21.11.2017


Ответы (3)


Мы можем установить непрозрачность для AVMutableVideoCompositionLayerInstruction, которая будет добавлена ​​к видео при экспорте, или AVPlayer в качестве свойства VideoComposition, что создаст эффект постепенного появления и исчезновения.

 [layerInstruction setOpacityRampFromStartOpacity:1.0 toEndOpacity:0.0 timeRange:CMTimeRangeMake(CMTimeSubtract([mutableComposition duration], CMTimeMake(Transition_Time, 1)), [mutableComposition duration])];

 [layerInstruction setOpacityRampFromStartOpacity:0.0 toEndOpacity:1.0 timeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMake(1, 1))];

это код для создания эффекта.


Более полные примеры:

person Parvez Belim    schedule 14.11.2013
comment
У вас есть более полный пример? Я не могу понять это. - person Justin Time; 17.12.2013
comment
Можете ли вы предоставить более подробную информацию, чтобы показать, как вы достигли желаемого эффекта? Был бы признателен за полный пример кода. - person Jordan H; 10.04.2016

у нас была точно такая же проблема в одном из наших приложений - и, к сожалению, нам пришлось отказаться от стандартного плеера и использовать логику из этого примера:

https://developer.apple.com/library/ios/samplecode/StitchedStreamPlayer/Listings/Classes_MyStreamingMovieViewController_m.html#//apple_ref/doc/uid/DTS40010092-Classes_MyStreamingMovieViewController_m-DontLinkElementID_8

надеюсь, это поможет.

person avs099    schedule 14.11.2013
comment
Я просмотрел этот пример кода ранее. Он просто меняет видео, и в нем также появляется черная часть на долю секунд. Я хочу, чтобы какие-то эффекты во время перехода от одного видео к другому видео. Что ж, спасибо за проявленный интерес и помощь!!! - person Parvez Belim; 15.11.2013
comment
я точно знаю, что у нас была та же проблема, что и у вас - нам пришлось воспроизвести 2 видео - одно за другим. Используя стандартное управление AvPlayer, мы получили паузу на долю секунды и/или мерцание черного. Решить эту проблему нам помогло использование техники из статьи выше - теперь 2 видео проигрываются как одно. Я постараюсь получить больше информации от нашей команды о том, что именно было сделано. - person avs099; 15.11.2013

Я смог добиться желаемого эффекта, используя два отдельных объекта AVPlayer, воспроизводящих одно за другим. Игроки используют разные виды для игры.

Идея состоит в том, чтобы исчезнуть в представлении второго видеоплеера до того, как закончится первое видео.

Демонстрационный проект можно найти здесь: IHLoopingVideoPlayerView.

Он повторяет одно и то же видео снова и снова, но одну и ту же идею можно применить к любому количеству видео.

person Ishan Handa    schedule 11.08.2016
comment
@iwasrobbed К вашему сведению, для ссылки требуется вход в систему. Те из нас, кто не находится в этом слабом канале, не могут получить к нему доступ. - person RonLugge; 21.11.2017
comment
@RonLugge Извиняюсь за это, вот пример кода от Apple: разработчик. apple.com/library/content/samplecode/avloopplayer/ - person iwasrobbed; 21.11.2017