我无法理解在什么条件下AVPlayer readyForDisplay对于本地存储的视频剪辑会是“YES”。我正在构建一个应用程序,其主视图有两个子视图,每个子视图都是UIView的自定义子类,包含一个AVPlayer和一个显示视频的APPlayerLayer。应用程序在显示这两个子视图之间切换以响应用户输入。在我的主视图控制器中,我有这样的事情:
- (void)viewDidLoad
{
firstView = [VideoView alloc] initWithFileName:@"clip1.mov"]]; // VideoViews are assigend to instance variables
secondView = [VideoView alloc] initWithFileName:@"clip2.mov"]];
[[self view] addSubview:firstView];
}
这些视图的初始化会加载AVPlayer并创建一个AVPlayerLayer。启动应用程序后,第一个剪辑会正确显示。响应用户输入,第二个视频显示在第一个视频的位置,如下所示:
- (void)responseToEvent
{
NSLog(@"%i", [targetView.readyForDisplay]); // prints out "1" in the console
[firstView removeFromSuperview];
[self.view addSubview:secondView];
}
这很好用。但是,如果我更改viewDidLoad以将secondView放入NSMutableDictionary中,如下所示:
- (void)viewDidLoad
{
firstView = [VideoView alloc] initWithFileName:@"clip1.mov"]];
VideoView *secondView = [VideoView alloc] initWithFileName:@"clip2.mov"]];
[someViews setObject: secondView forKey:viewIndex];
[[self view] addSubview: firstView];
}
...然后稍后从某些视图中获取视图:
- (void)responseToEvent
{
VideoView *secondView = [neighborViews objectForKey:link.targetView.pftViewId];
NSLog(@"%i", [targetView.readyForDisplay]); // prints out "0" in the console
[firstView removeFromSuperview];
[self.view addSubview:secondView];
}
......这不起作用。没有显示视频。我无法理解为什么将包含视图放入NSMutableDictionary会导致AVPlayer没有准备好并且不显示视频。此外,视频永远不会出现(它永远不会变成“准备好”)。有谁知道这里发生了什么?
答案 0 :(得分:0)
使用键值观察器来监听状态的变化:
[self.playerLayer addObserver:self forKeyPath:@"readyForDisplay" options:0 context:NULL];
然后在同一个类中添加:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"readyForDisplay"]) {
确保删除最后的观察者