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

Я работаю над видеоприложением, которое воспроизводит несколько видео один за другим. Видео сохраняются в массиве AVPlayerItem s. 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?

Ответ 1

Мы можем установить непрозрачность для 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))];

это код для предоставления эффекта.


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

Ответ 2

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

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

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

Ответ 3

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

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

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

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