ios - MPMoviePlayerController 阻塞主线程

标签 ios iphone objective-c mpmovieplayercontroller audio-streaming

我正在使用 MPMoviePlayerController(MPMPC) 将音频流式传输到应用程序中,效果非常好。只有一个异常(exception),在网络连接较低时,应用程序会变得无响应。

现在我什至尝试过使用AVPlayer,但体验或多或少相同。由于某种原因,我在互联网上找不到与此相关的任何问题。所以我不确定这是否是我的想法,或者是 MPMoviePlayerController 在低连接情况下的行为方式。

我什至尝试记录在向 MPMPC 提供 URL 后调用的任何函数,但没有调用任何函数。

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

MPMoviePlayerLoadStateDidChangeNotification
MPMoviePlayerPlaybackDidFinishNotification
MPMoviePlayerPlaybackStateDidChangeNotification

最佳答案

一旦可用网络带宽变得太低而无法正常播放,MPMoviePlayerController将触发MPMoviePlayerLoadStateDidChangeNotificationloadState将有MPMovieLoadStateStalled放。

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

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

一旦玩家恢复过来,MPMoviePlayerLoadStateDidChangeNotification 就会再次出现。被触发并且 loadState属性将具有 MPMovieLoadStatePlaythroughOK 的位设置:

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

但是,我从未经历过因 MPMovieLoadStateStalled 导致我的应用程序界面变慢的情况。状态。我想说这一定是你的代码表现得很奇怪,它不是 MPMoviePlayerController据我所知。此外,这些通知始终会发送,我从未遇到过它们未正确触发的情况。

我只能建议在最小的测试用例中重新创建此问题,然后从该测试用例逐步升级到您的应用程序(可能从测试用例和您的应用程序双方)。

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

关于ios - MPMoviePlayerController 阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20797546/

相关文章:

ios - dispatch_after block 未运行

android - 开发android和iphone应用程序

ios - 如何在 'viewDidLoad' 上隐藏 UIPickerView?

iOS Facebook 网络共享 api - 如何判断用户是否点击了跳过

iphone - 为什么我的 UIPickerView 崩溃了?

objective-c - UIImage 调整绘制矩形大小并用黑色填充背景

ios - 向 Sprite Kit Landscape 添加 iAd

iphone - 如何在 Xcode webview 中加载本地 HTML 文件而不是网页?

iphone - 一旦 App 进入后台,AVAssetWriter 就会失败

ios - 如何更新 UITableViewRowAction 中的按钮?