我假设initWithContentURL:
方法不是异步的。我添加了以下方法来在后台执行加载,然后将临时播放器分配给我的变量。
-(void)createPlayer {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MPMoviePlayerController *temp = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"URLString"]];
[self performSelectorOnMainThread:@selector(passPlayer:) withObject:temp waitUntilDone:YES];
[temp release];
[pool release];
}
-(void)passPlayer:(MPMoviePlayerController*)temp {
player = [temp retain];
player.movieSourceType = MPMovieSourceTypeStreaming;
//player.view.hidden = YES;
//[self.view addSubview:player.view];
[player prepareToPlay];
}
问题是,当我打印出播放器的持续时间时,我得到了这个:
double duration = player.duration;
NSLog(@"duration: %f, duration);
console output: duration: nan
我已添加MPMoviePlayerControllerNotifications
,以便在有可用的持续时间值时收到通知,但即便如此,该值仍为“nan”。如果我在主线程上加载持续时间有一个值,但我不想使用主线程,所以我的UI没有锁定。
有什么想法吗?
答案 0 :(得分:4)
首先,不要在非主线程上创建UI对象。所有UI操作必须在主线程上完成,否则会发生奇怪的事情。也许,电影永远不会加载,NAN会在一段时间内返回。
其次,initWithContentURL:
可能 是异步的,或者在实际加载电影时不会通知您通知。只需像平常一样创建控制器,订阅相应的通知以了解状态何时更新,然后立即检查状态,以防电影恰好是本地文件或已经缓存,以便负载能够同步进行
答案 1 :(得分:3)
这是因为电影播放器无法计算持续时间。如果您订阅MPMovieDurationAvailableNotification
通知,则会在确定值时通知您。
<强> MPMovieDurationAvailableNotification 强>
此通知发布时 电影对象的持续时间是 决心。的目标 通知是 MPMoviePlayerController对象本身。 没有userInfo字典。该 持续时间值反映在 电影播放器的持续时间属性 控制器。
答案 2 :(得分:2)
来自官方文件:
讨论 如果电影的持续时间未知,则此属性中的值为0.0。如果随后确定了持续时间,则会更新此属性并发布MPMovieDurationAvailableNotification通知。
因此,请使用NSNotificationCenter注册MPMovieDurationAvailableNotification通知。