使用 AVQueuePlayer 时如何在视频之间添加过渡?

Posted

技术标签:

【中文标题】使用 AVQueuePlayer 时如何在视频之间添加过渡?【英文标题】:How to add transition between videos when using AVQueuePlayer? 【发布时间】:2013-11-07 06:02:56 【问题描述】:

我正在开发一个视频应用程序,它可以一个接一个地播放多个视频。视频存储在AVPlayerItems 的数组中。 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 中的视频?

【问题讨论】:

我想要同样的如果你找到了你的解决方案然后在这里发布它会帮助其他人。 Apple 提供了使用队列播放器和无缝转换的示例代码,如果有帮助的话:developer.apple.com/library/content/samplecode/avloopplayer/… 【参考方案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))];

这是产生效果的代码。


更完整的例子:

https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html https://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos

【讨论】:

你有更完整的例子吗?我似乎无法弄清楚这一点。 您能否提供更多细节来展示您是如何实现预期效果的?一个完整的代码示例将不胜感激。 示例:raywenderlich.com/30200/…【参考方案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 个视频 - 一个接一个。使用标准的 AvPlayer 控件 - 我们暂停了几分之一秒,和/或黑色闪烁。使用上面文章中的技术帮助我们解决了这个问题 - 现在播放了 2 个视频,就像一个视频一样。我将尝试从我们的团队那里获得更多关于具体完成的信息。【参考方案3】:

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

这个想法是在第一个视频结束之前淡入第二个视频播放器的视图。

演示项目可以在这里找到:IHLoopingVideoPlayerView

它一遍又一遍地循环播放相同的视频,但相同的想法可以应用于任意数量的视频。

【讨论】:

@iwasrobbed 仅供参考,该链接需要登录。我们这些不在那个闲散频道中的人无法访问它。 @RonLugge 对此深表歉意,这是来自 Apple 的示例代码:developer.apple.com/library/content/samplecode/avloopplayer/…

以上是关于使用 AVQueuePlayer 时如何在视频之间添加过渡?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AVQueuePlayer?

Swift:在avqueueplayer中播放完毕后重播视频

AVQueuePlayer 从资产跳转到另一个时令人讨厌的延迟

为 AVQueuePlayer/AVPlayer 从网络预加载视频文件

当 AVQueuePlayer 完成最后一个播放项时如何做某事

使用带有 AVQueuePlayer 的 Switch 语句?