ItemFailedToPlayToEnd - MPMoviePlayerController - iOS7

Запуск в странную проблему при обновлении моего приложения для iOS 7. Для iOS 6 нет проблем, и видео всегда загружается. Однако это не так.

У меня есть scrollview, который отображает playlistItems - и как только вы нажимаете на playlistItem, создается MPMoviePlayerController для отображения элемента списка воспроизведения (видео).

Вот метод, который, по моему мнению, вызывает проблемы:

- (void) play:(NSInteger)itemId withAutostart:(BOOL)autostart {

  // remember whether it is in fullscreen or not to restore for the next playlist item
  self.playerInFullscreen = self.player.isFullscreen;

  if (player != nil) {
    [self.player setFullscreen:NO animated:NO];
    [self stopListeningPlaybackFinishedEvents];
    [player stop];
    [self startListeningPlaybackFinishedEvents];
  }

  PlaylistItem * pi = [dbHelper getPlaylistItem:itemId];
  NSURL *movieURL = [pi getMovieUrl];

  if (DELEGATE.useSSL) {

    NSURLCredential *credential = [[NSURLCredential alloc]
                                 initWithUser: DELEGATE.username
                                 password: DELEGATE.password
                                 persistence: NSURLCredentialPersistenceForSession];

    NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                           initWithHost: [movieURL host]
                                           port: 80
                                           protocol: [movieURL scheme]
                                           realm: [movieURL host]
                                           authenticationMethod: NSURLAuthenticationMethodHTTPBasic];

    [[NSURLCredentialStorage sharedCredentialStorage]
     setDefaultCredential: credential
     forProtectionSpace: protectionSpace];

    [protectionSpace release];
    [credential release];
  }


  MPMoviePlayerController * temp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    [temp prepareToPlay];

  self.player =  temp;
  [temp release];

    player.shouldAutoplay = autostart;
  player.view.frame = movieViewContainer.bounds; 
  [movieViewContainer addSubview:player.view];

    NSLog(@"movie added to subview");

  [player setFullscreen:self.playerInFullscreen animated:NO];
  [self.view setNeedsDisplay];
}

Фильм загружается в MovieContainerView.

- (void)playlistItemSelected:(NSInteger)itemId withAutostart:(BOOL) autostart {
  for(UIView *subview in [thumbsScrollView subviews]) {
    if ([subview isKindOfClass:[PlaylistItemView class]] == YES ) {

      PlaylistItemView *piv = ((PlaylistItemView *) subview);
      [piv setCurrent: piv.playlistItem._id == itemId];

      if (piv.playlistItem._id == itemId) {
        [self ensurePlaylistItemViewVisible:piv];
      }
    }
  }
  [[movieViewContainer subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
  self.currentPlaylistItem = [dbHelper getPlaylistItem:itemId];
  [self updateMetadataArea:itemId];

  if ([_currentPlaylistItem.type isEqual:VIDEO_TYPE]) {
    self.zoomButtonOut.hidden = YES;
    self.zoomButtonIn.hidden  = YES;

    [self play:itemId withAutostart:autostart];
  }
  else {
     [self.player pause];
    _zoomButtonIn.alpha = ZOOM_BUTTON_ALPHA;
    _zoomButtonOut.alpha = ZOOM_BUTTON_ALPHA;
    [self showPDFandImage:_currentPlaylistItem];
  }
  [self scrollViewDidEndDecelerating:nil];
 }

Странно, что это работает для iOS 6, но не iOS 7

Вот ошибки NSLog, когда видео не загружается/воспроизводится: <Error>: CGImageCreate: invalid image size: 0 x 0. и: _itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; }

Ответ 1

Это были бы две проблемы

  • Проблема с URL

    a) Если он извлекает из api, вы должны писать, [NSUrl urlwithString: "ваша строка url" ];

    //ваша строка url не является строкой URL-адреса youtube.

    b) Если это путь пакета: [NSUrl fileWithPath: "Ваш путь" ];

  • Проблема с типом источника.

    Установите тип scouce для любого, если он не работает, настроен на другой тип viceversa

    yourPlayerController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
    

    или

    yourPlayerController.moviePlayer.movieSourceType = MPMovieSourceTypeUnknown;
    

Ответ 2

У меня такая же проблема на моей сборке iOS 7. Могу ли я спросить, есть ли в вашем URL-адресе пробелы и цифры?

i.e. my url was something like "video title 5.2.5.mov" and when I escaped the string using the NSUTF8StringEncoding, the result was "video%20title%205.2.5.mov" and it didn't work.

I tried changing the movie url to video_title_5_2_5.mov" and it loaded fine

надеюсь, что этот совет поможет немного

Ответ 3

Совет для тех, кто реализует локальные файловые кэши: включает расширения файлов

У меня есть локальный кеш загрузки в одном из моих приложений, который не отличается от filetype [к лучшему или худшему], в результате чего файлы без связанных с ними типов. Когда я подаю файл с сервера непосредственно в контроллер видео, файл воспроизводится отлично, однако, когда он хранится локально в пути: [AppDocumentsDirectory]/123 (без расширения) он не воспроизводится. Когда я сохранил файл как 123.mp4, он преуспел.

Ответ 4

Я закончил тестирование приложения на реальном ipod - и он сработал. У url Im init с mpmoviecontroller не было никаких пробелов, которые мне нужно было убежать. Надеюсь, это поможет... видео не работают на симуляторе, который меня отбрасывал.

Ответ 5

У меня была такая же проблема, и она была исправлена ​​установкой

[MPMoviePlayerViewController.moviePlayer setShouldAutoplay:YES]

Проблема, которую я видел, заключалась в том, что проигрыватель фильмов будет нажимать на контроллер навигации, но сразу же, когда он появился, он исчезнет, ​​и я получу ошибку _itemFailedToPlayToEnd в журнале

Ответ 6

У меня была такая же проблема. Сначала проверьте, что файл, из которого вы хотите воспроизвести это видео, существует или нет. Затем проиграйте. В моем случае мой файл находился в каталоге документа .so

    BOOL hasVideoFile= [[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/%@",[self getDocumentDirectory] videoFileName]];
    if (!hasVideoFile) {
        //No video found
        NSLog(@"Video file doesn't exists in this directory");
    }