我正在使用 AVPlayer
在没有控件的情况下加载并充当动画。背景呈现动画的第一个和最后一个屏幕。
当 AVPlayerController
出现时,屏幕闪烁黑色 瞬间,因为 Controller 加载了相应的视频。
显而易见的答案是尽快预加载 AVPlayerController
,即在页面加载时预加载。
但是,我的问题是,根据用户点击的按钮,视频必须正确对应。因此,我无法预加载,因为不确定用户需要观看哪个视频。
函数 playAnimation
被调用并带有相应的视频文件路径。
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
中加载此视频 Controller ,然后更改其源并根据要求播放而不影响流畅度?
最佳答案
我解决了!
我创建了一个 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];
要在播放后关闭 View ,然后添加 notification observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playBackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
AVPlayerItem *playerItem = player.currentItem;
这是被调用以关闭 View 的函数...
-(void)playBackFinished:(NSNotification *) notification {
[arrayOfLayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
}
关于ios - Objective C 如何为 AVPlayer 提供多种文件路径可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152247/