MPMoviePlayerController阻塞主线程

时间:2013-12-27 08:44:29

标签: ios iphone objective-c mpmovieplayercontroller audio-streaming

我正在使用MPMoviePlayerController(MPMPC)将音频流式传输到应用程序中,而且工作得非常好。只有一个例外,在低网络连接期间,应用程序无响应。

现在我甚至尝试过使用AVPlayer,但体验或多或少相同。由于某种原因,我无法在互联网上找到任何与此相关的问题。所以我不确定这是不是我的结论,还是MPMoviePlayerController在低连接期间的行为。

我甚至尝试在将URL提供给MPMPC之后记录所调用的任何函数,但没有调用任何函数。

我使用了以下三个通知来获取MPMPC的事件

MPMoviePlayerLoadStateDidChangeNotification
MPMoviePlayerPlaybackDidFinishNotification
MPMoviePlayerPlaybackStateDidChangeNotification

1 个答案:

答案 0 :(得分:4)

一旦可用的网络带宽变得太低而无法保持正常播放,MPMoviePlayerController将触发MPMoviePlayerLoadStateDidChangeNotification,而loadState将设置MPMovieLoadStateStalled

然后,您可以屏蔽通知处理程序中的加载状态,并针对此状态运行应用程序所需的任何操作:

if ((movieController_.loadState & MPMovieLoadStateStalled) == MPMovieLoadStateStalled)
{
   NSLog(@"playback stalled - make sure we don't block now!");
}

播放器恢复后,会再次触发MPMoviePlayerLoadStateDidChangeNotificationloadState属性将设置MPMovieLoadStatePlaythroughOK位:

if ((movieController_.loadState & MPMovieLoadStatePlaythroughOK) == MPMovieLoadStatePlaythroughOK)
{
   NSLog(@"playback should run uninterrupted from now on.");
}

但是,我从未遇到MPMovieLoadStateStalled状态引起的应用程序界面减速。我会说你的代码一定很奇怪,但我并不是MPMoviePlayerController。此外,这些通知始终发送,我从未体验过没有正确触发的情况。

我只能建议在最小的测试用例中重新创建此问题,然后从那个问题开始向您的应用程序(可能来自双方,测试用例和您的应用程序)进行操作。

为了模拟带宽故障,我建议使用Charles proxy