使用AVQueuePlayer时如何在视频之间添加转换?

时间:2013-11-07 06:02:57

标签: ios avplayer avqueueplayer avplayerlayer

我正在开发一个视频应用程序,它可以一个接一个地播放大量视频。视频存储在AVPlayerItem s的数组中。 AVQueuePlayer初始化了AVPlayerItems,并自动播放该数组中的视频。

问题是当它改变播放下一个视频时它会卡住一秒钟,或者在它从一个视频转换到另一个视频时产生一个混蛋。我希望通过某种动画来改善这种转换,例如在视频改变时淡入和淡出。

我的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

中的视频

3 个答案:

答案 0 :(得分:5)

我们可以设置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))];

这是给出效果的代码。


更完整的例子:

答案 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

希望有所帮助。

答案 2 :(得分:0)

通过使用两个独立播放的AVPlayer对象,我能够达到预期的效果。玩家正在使用不同的视图进行游戏。

这个想法是在第一个视频完成之前淡出第二个视频播放器的视图。

可以在此处找到演示项目:IHLoopingVideoPlayerView

它反复循环播放相同的视频,但同样的想法可以应用于任意数量的视频。