_itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; }

近日在做一个基于MPMoviePlayerViewController播放m3u8格式的广播APP时候,引发一个全球的搜索,在简单的代码播放测试成功后,

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];  

做了播放状态的监测,代码如下:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];  
  2.         [notificationCenter addObserver:self  
  3.                                selector:@selector(moviePlayerPreloadDidFinish:)  
  4.                                    name:  
  5.          MPMediaPlaybackIsPreparedToPlayDidChangeNotification  
  6.                                  object:player];  

可以从接口API文件中找到这个已经加载成功后的通知,非常简单即可完成,但是根据程序员的0 1 思想,有成功,必然要有失败,于是让手机处于飞行模式,于是检测到爆出错误:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. _itemFailedToPlayToEnd: { kind = 1new = 2; old = 0; }  

但是找遍系统API也没有找到一个监测到失败加载的通知,于是开始有目的的Google和百度,甚至stackoverflow,但是都是疑问和我类似,始终没有发现解决方案,最后终于在一个角落找到一个解决方案,根据代码测试,发现非常靠谱,代码如下:

首先,设置通知监听:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [notificationCenter addObserver:self  
  2.                                selector:@selector(videoHasFinishedPlaying:)  
  3.                                    name:MPMoviePlayerPlaybackDidFinishNotification  
  4.                                  object:player];  


然后在监听回调函数中做如下判断:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. - (void)videoHasFinishedPlaying:(NSNotification *)paramNotification{  
  2.     /* Find out what the reason was for the player to stop */  
  3.     NSNumber *reason =  
  4.     [paramNotification.userInfo  
  5.      valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];  
  6.     if (reason != nil){  
  7.         NSInteger reasonAsInteger = [reason integerValue];  
  8.         switch (reasonAsInteger){  
  9.             case MPMovieFinishReasonPlaybackEnded:{  
  10.                 /* The movie ended normally */  
  11.                 break; }  
  12.             case MPMovieFinishReasonPlaybackError:{  
  13.                 /* An error happened and the movie ended */  
  14.                 break;  
  15.             }  
  16.             case MPMovieFinishReasonUserExited:{  
  17.                 /* The user exited the player */  
  18.                 break;  
  19.             }   
  20.         }  
  21.         NSLog(@"Finish Reason = %ld", (long)reasonAsInteger);  
  22.     } /* if (reason != nil){ */   
  23. }   

通过以上判断即可得到加载失败的原因,可以处理 _itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; } 这种错误信息,最后根据自己的需要完成用户提示等功能,至此实现了 0 1 功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值