2014-10-03 2 views
2

Если я дам MPMoviePlayerViewController плохой видео URL, чтобы играть, как так:MPMoviePlayerController Bad Url Ошибка

[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:@"http://badurl"]]; 

Есть ли способ, чтобы получать уведомления о том, что видео не скачать?

Я попробовал оба из следующих действий, но не был уведомлен в любом случае:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateChanged) name:MPMoviePlayerLoadStateDidChangeNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
+0

Это работало в iOS 7, но перестало работать в iOS 8. У меня есть открытая ошибка с Apple, но они ничего не сделали с этим. Я закончил использовать таймер, который является ужасным дизайном, но единственным решением, которое работает. – Kevin

+0

Да, с помощью iOS 8.1 и моего MPMoviePlayer.url вы получаете ошибку 404, но это не запускает [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (имя воспроизведенияDidFinish :): MPMoviePlayerPlaybackDidFinishNotification object: nil]; – Lombas

ответ

4

первую очередь проверьте, если URL достижима с помощью Rechability.

NSURL *myURL = [NSURL urlWithString: @"http://example.com"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{ 
     NSURLResponse *response; 
     NSError *error; 
     NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 
     BOOL reachable; 

     if (myData) { 
      // we are probably reachable, check the response 
      reachable=YES; 
     } else { 
      // we are probably not reachable, check the error: 
      reachable=NO; 
     } 

     // now call ourselves back on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setReachability: reachable]; 
     }); 
}); 

его упоминания этот ответ link

или

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 


- (void) playbackDidFinish:(NSNotification*)notification{ 
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; 
switch ([reason intValue]) { 
    case MPMovieFinishReasonPlaybackEnded: 
     NSLog(@"Playback Ended");   
     break; 
    case MPMovieFinishReasonPlaybackError: 
     NSLog(@"Playback Error"); //// this include Bad URL 
     break; 
    case MPMovieFinishReasonUserExited: 
     NSLog(@"User Exited"); 
     break; 
    default: 
     break; 
    } 
} 

или добавить пользовательскую функцию для проверки запроса тайм-аут ..

[self performSelector:@selector(checkTimeout:) withObject:theMovie afterDelay:15]; 

, если вы не получаете Notification в вашем коде
, пожалуйста, проверьте этот ответ для дальнейшей справки. link

+0

Спасибо, и отличный ответ. В моем случае у нас есть ситуация, когда у нас есть 5 серверов за балансировщиком нагрузки. Иногда некоторые из этих серверов возвращают 404, в то время как остальные возвращают 200. Если я попытаюсь извлечь манифест/видео (HLS) до того, как видеопроигрыватель выполнит это, то это не гарантирует, что следующий запрос игрока будет успешным. Очевидно, мы пытаемся исправить проблему на стороне сервера, но для клиента было бы идеально и корректно обрабатывать ситуацию. Я никогда не получаю уведомление о завершении воспроизведения ... – Steve

+0

вы можете добавить тайм-аут запроса .. используя пользовательскую функцию .. или использовать что-то похожее на это .. [ссылка] (http://stackoverflow.com/a/5869448/1721884) или [link] (http://stackoverflow.com/a/7659735/1721884) –

+0

@Steve: если приведенный выше ответ не сработал для вас. попробуйте использовать 'ffmpeg' или' AVFoundation'. попробует это самостоятельно, прежде чем менять свой ответ. Попробуйте отредактировать свой вопрос, объяснив проблему с базой. –

Смежные вопросы