异步MPMoviePlayerController加载没有持续时间值

时间:2011-06-18 18:06:05

标签: iphone ios4 asynchronous mpmovieplayercontroller

我假设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没有锁定。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

首先,不要在非主线程上创建UI对象。所有UI操作必须在主线程上完成,否则会发生奇怪的事情。也许,电影永远不会加载,NAN会在一段时间内返回。

其次,initWithContentURL:可能 是异步的,或者在实际加载电影时不会通知您通知。只需像平常一样创建控制器,订阅相应的通知以了解状态何时更新,然后立即检查状态,以防电影恰好是本地文件或已经缓​​存,以便负载能够同步进行

答案 1 :(得分:3)

这是因为电影播放器​​无法计算持续时间。如果您订阅MPMovieDurationAvailableNotification通知,则会在确定值时通知您。

<强> MPMovieDurationAvailableNotification

  

此通知发布时   电影对象的持续时间是   决心。的目标   通知是   MPMoviePlayerController对象本身。   没有userInfo字典。该   持续时间值反映在   电影播放器​​的持续时间属性   控制器。

来源:Apple documentation

答案 2 :(得分:2)

来自官方文件:

  

讨论   如果电影的持续时间未知,则此属性中的值为0.0。如果随后确定了持续时间,则会更新此属性并发布MPMovieDurationAvailableNotification通知。

因此,请使用NSNotificationCenter注册MPMovieDurationAvailableNotification通知。