У меня есть универсальное приложение для iPhone / iPad, которое транслировало видео с помощью MPMoviePlayerController через Wi-Fi (mp4) и сеть 3G (3gp). Когда вышла iOS 4.3, наши устройства 4.3 больше не могли воспроизводить видео 3gp по сети 3G. Я протестировал локальный файл 3gp, и он тоже не работает, но работает на телефоне 3G с 4.2.x.
После отладки контроллера представления я вижу, что уведомление MPMoviePlayerLoadStateDidChangeNotification не запускается при попытке воспроизведения файла 3gp локально или потоковой передачи по URL-адресу.
[APPDEL showStatusView: @"Please wait..."];
NSString * videoUrl = [[request.URL description] stringByReplacingOccurrencesOfString: @"idvideo:" withString: @"http:"];
DLog(@"Loading video %@", videoUrl);
_moviePlayer = [[IDMoviePlayerController alloc] initWithContentURL: [NSURL URLWithString: videoUrl]];
_moviePlayer.view.backgroundColor = [UIColor clearColor];
_moviePlayer.allowsAirPlay = YES;
_moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
if ([_moviePlayer respondsToSelector:@selector(loadState)]) {
// May help to reduce latency
[_moviePlayer prepareToPlay];
// Register that the load state changed (movie is ready)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerLoadStateChanged:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:_moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerPreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:_moviePlayer];
//[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(moviePlayerTimerUp:) userInfo:nil repeats:NO];
}
else {
// Register to receive a notification when the movie is in memory and ready to play.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(onMovieDone:) name: MPMoviePlayerPlaybackDidFinishNotification object: nil];
if ([_moviePlayer respondsToSelector: @selector(view)]) {
[self.view addSubview: _moviePlayer.view];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
_moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
}
else {
_moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
}
_moviePlayer.view.frame = _webView.frame;
}
[_moviePlayer play];
Первое условие для loadState всегда выполняется. Для файла 3gp код никогда не достигнет метода селектора moviePlayerLoadStateChanged, который скрывает отображение индикатора / статуса и создает другие полноэкранные уведомления / уведомления об ориентации. Индикатор / статус просмотра просто будет работать и вращаться. В отладчике я вижу, что метод селектора onMovieDone запускается гораздо раньше, чем видео действительно закончено.
Confused.