Objective C 如何为 AVPlayer 提供多个文件路径可能性
Objective C How to to present AVPlayer with multiple filePath possibilities
我正在使用 AVPlayer
在没有控件的情况下加载并充当动画。背景呈现动画的第一个和最后一个屏幕。
当 AVPlayerController
出现时,屏幕闪烁黑色 瞬间,控制器加载相应的视频。
显而易见的答案是尽快预加载 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
之前加载这个视频控制器,然后在不影响流畅度的情况下根据要求改变它的来源和播放吗?
我解决了!
我创建了一个 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)];
}
我正在使用 AVPlayer
在没有控件的情况下加载并充当动画。背景呈现动画的第一个和最后一个屏幕。
当 AVPlayerController
出现时,屏幕闪烁黑色 瞬间,控制器加载相应的视频。
显而易见的答案是尽快预加载 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
之前加载这个视频控制器,然后在不影响流畅度的情况下根据要求改变它的来源和播放吗?
我解决了!
我创建了一个 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)];
}