【问题标题】:iPhone - MPMoviePlayerController identify when stopped playing and when startediPhone - MPMoviePlayerController 识别何时停止播放和何时开始
【发布时间】:2011-08-14 03:52:49
【问题描述】:

在我的应用程序中,我使用 MPMoviePlayerController 从我的服务器播放流式视频。 我隐藏了控件并有自己的按钮来指示播放器是否正在播放、暂停或停止。 我想根据流媒体的状态启用/禁用按钮。

我正在使用以下代码来启动播放器:

self.avPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:audioURL]];
[self.avPlayer.moviePlayer setShouldAutoplay:YES];
[self.avPlayer.moviePlayer prepareToPlay];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlayStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];       

播放开始时,我会收到通知。但如果由于某种原因,wifi 速度很慢或不可用,播放器可能正在流式传输,而我没有收到任何通知。 为什么视频正在播放时我没有收到通知?

此外,当视频在中间播放时,播放器会停止并抛出“完成”通知。如何防止它在流式传输期间停止.....

【问题讨论】:

  • 这是因为连接问题吗?
  • 是的 Nicolas,这是由于连接问题而发生的。

标签: iphone mpmovieplayercontroller


【解决方案1】:

首先,我认为您应该指定movieSourceType 属性:

self.avPlayer.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;

现在,关于通知,

  • 首先,为什么不检查之前和之后的playbackState 属性,以了解为什么调用通知、何时以及是否调用通知。
  • 也许更可靠的指标,因为这些似乎是连接问题,是处理 MPMoviePlayerLoadStateDidChangeNotification 并检查 loadState 属性(就像 PlaybackStateChanged 的​​通知一样,没有用户信息字典,所以你必须通读它loadState 属性)。
  • 最后,对于MPMoviePlayerPlaybackDidFinishNotification 在流式传输过程中被抛出,我猜有一些错误,因为其他选项可能是电影到达结尾或用户自己停止了电影。同样,您可以通过读取在通知的 userinfo 字典参数中作为键传递的 MPMovieFinishReason 常量来检查调用通知的原因。

【讨论】:

  • 通过设置movieSourceType,解决了一个问题。即网络恢复后继续播放。当网络中断时,我只会收到有关负载状态的通知。这也是它的“MPMovieLoadStateUnknown”。
  • 好吧,还不错。至少现在已经解决了一些问题。我们会到达那里;) MPMoviePlayerController 不是一个特别容易出错的 API,但我承认它有它的问题。无论如何,您是否注意到播放状态通知有任何变化?流式传输过程中完成的通知呢,您是否从 userinfo 字典中找到原因?
  • 播放状态通知会在用户通过触摸控件或代码暂停或播放或停止时引发。我没有收到完成通知。现在唯一剩下的是,当它流式传输时,我没有收到任何通知让播放按钮暂停/停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2012-09-15
相关资源
最近更新 更多