我正在使用AVPlayer
加载,没有控件并充当动画。背景显示动画的第一个和最后一个屏幕。
当显示AVPlayerController
时,屏幕会闪烁黑色一瞬间,因为控制器加载了相应的视频。
显而易见的答案是尽快预加载AVPlayerController
,即在页面加载时。
但是,我的问题是,根据用户单击的按钮,视频必须正确对应。因此,我无法预加载,因为无法确定用户需要观看哪个视频。
该函数playAnimation
使用视频的相应 filePath 进行调用。
AVPlayer *player;
AVPlayerViewController *playerViewController;
- (void) playAnimation: (NSString*)filePath {
NSURL *videoURL = [NSURL fileURLWithPath:filePath];
//filePath may be from the Bundle or from the Saved file Directory, it is just the path for the video
player = [AVPlayer playerWithURL:videoURL];
playerViewController = [AVPlayerViewController new];
playerViewController.player = player;
playerViewController.showsPlaybackControls = false;
[self presentViewController:playerViewController animated:false completion:^{
[playerViewController.player play];//Used to Play animation
}];
有没有办法事先在viewDidLoad
中加载此视频控制器,然后更改其源并根据要求播放,而不会影响流畅度?
我解决了!
我创建了一个AVPlayerLayer
,然后将其附加到UIView
,它的工作原理不会引起黑屏闪烁并且过渡看起来更平滑,因为它首先使用正确的视频文件路径进行初始化,然后作为子层添加到UIView
上,然后我调用播放视频。
这是我最后使用的代码。对于任何想知道如何将 AVPlayer 附加到 UIView 的人来说,这可能会有所帮助。
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height;
playerLayer.frame = CGRectMake(0, 0, width, height);
下面的代码将AVPlayerLayer
添加到UIView
,但也将其添加到一个层数组中,当我需要调用removeFromSuperlayer
时,我可以使用该数组,以便在它完成播放后关闭。
[self.videoView.layer addSublayer:playerLayer];
[arrayOfLayers addObject:playerLayer];
[playerViewController.player play];
若要在视图播放后将其关闭,请添加notification observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playBackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
AVPlayerItem *playerItem = player.currentItem;
这是调用以关闭视图的函数...
-(void)playBackFinished:(NSNotification *) notification {
[arrayOfLayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
}