目标 C 如何呈现具有多个文件路径可能性的 AVPlayer



我正在使用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)];
}

最新更新