【问题标题】:Asynchronous MPMoviePlayerController load has no duration value异步 MPMoviePlayerController 加载没有持续时间值
【发布时间】:2011-06-18 18:06:04
【问题描述】:

我假设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 不会锁定。

有什么想法吗?

【问题讨论】:

  • 您最初的假设是错误的 - initWithContentURL 是异步的。
  • @Till 有什么文档可以指点我吗?
  • 不,不幸的是,我得到的只是丰富的使用经验。即使远程服务器无法/几乎无法访问,它也不会引入可识别的延迟。
  • @Till 看起来你是对的。导致推送延迟的行是prepareToPlay。但是,如果我删除那条线,玩家根本不会玩。我尝试设置一个计时器以在视图加载后一秒钟调用它,但它根本不会播放。有什么想法吗?
  • 好吧,明确地说,MPMoviePlayerController 方法都没有使用同步网络访问。如果使用得当,它们都会立即返回。我建议您删除所有手动穿线并再次检查。 prepareToPlay 在我已经完成的播放器实现中也会立即返回。

标签: iphone ios4 asynchronous mpmovieplayercontroller


【解决方案1】:

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

其次,initWithContentURL: 可能异步的,否则不会有通知让您知道电影何时实际加载。只需像往常一样创建控制器,订阅适当的通知以了解状态何时更新,然后立即检查状态,以防电影恰好是本地文件或已缓存,以便能够同步加载.

【讨论】:

  • 似乎init 方法是同步的。它绑定了 UI 并滞后于新的视图推送——这是我在这里试图避免的。每当我使用initWithContentURL: 方法或一般allocinit 创建播放器并执行setContentURL: 时,它都会绑定UI。我可以稍后创建播放器(比如当他们按下播放按钮时),但我希望它能够早点开始加载。
【解决方案2】:

发生这种情况是因为电影播放器​​无法计算持续时间。如果您订阅了MPMovieDurationAvailableNotification 通知,您将在确定值时收到通知。

MPMovieDurationAvailableNotification

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

来源:Apple documentation

【讨论】:

  • 我添加了通知,偶尔(随机)我仍然会得到一个“nan”值。有什么想法吗?
【解决方案3】:

来自官方文档:

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

所以使用 NSNotificationCenter 注册 MPMovieDurationAvailableNotification 通知。

【讨论】:

  • 我添加了通知,偶尔(随机)我仍然会得到一个“nan”值。有什么想法吗?
  • 但是您在通知调用的方法中检查持续时间,对吗?
  • 对,我在通知调用的选择器方法中对其进行了 NSLog 记录。
  • 可能是因为你在线程中创建了 MPMoviePlayerController,你确定 initWithContentURL 是同步的吗?因为有一个 MPMoviePlayerLoadStateDidChangeNotification 通知可以知道电影何时可以播放。
  • 不,我不肯定,但我猜是因为 NSData -initWithContentsOfURL 是。我线程化它的原因是因为延迟推送包含播放器的新视图控制器,我认为这是在 viewDidLoad 中触发的 init 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2017-05-21
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多