iOS5: MPMoviePlayerController ТОЛЬКО ВИДЕО, НЕТ АУДИО - PullRequest
7 голосов
/ 31 октября 2011

Это не проблема «Нет видео, только звук» .Это просто напротив .Проблема возникает при использовании iOS 5.0.iPad под управлением 4.3 или ниже воспроизводит одни и те же видеофайлы без ошибок.

, поскольку iOS 5 изменила способ инициализации материала для MPMoviePlayerControllers, мне пришлось выполнить некоторое программирование на основе SDK, чтобы отобразить видео.Перед внедрением фрагмента, который я покажу далее, видео и его элементы управления даже не будут отображаться на экране.Контроллер будет показывать только черный квадрат с размером и происхождением данного фрейма CGRect.

Я обращаюсь с ним следующим образом:

Видеофайлы находятся в папке документов.Поэтому NSURL должен быть инициализирован как fileURLWithPath.Как только это будет сделано, я приступаю к инициализации контроллера с заданным кадром.Так как иначе это не сработает, представление добавит проигрыватель только после изменения loadState.Это достигается путем подписки на уведомление.селектор подписчика выполняет добавление представления контроллера к родительскому представлению в главном потоке , поскольку уведомление может обрабатываться из других потоков.

Инициализация и добавление видео в представление:

-(void)addVideo:(NSString*) videoName onRect:(CGRect)rect {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    iPadMagazineAppDelegate *appDelegate = GET_APP_DELEGATE;
    NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dirName = [dirArray objectAtIndex:0];

    // get directory name for this issue
    NSURL *baseURL; 

    /* 
     BUGFIX: Video does not work on iOS 5.0

     */
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")){
        baseURL = [[NSURL fileURLWithPath:dirName]URLByAppendingPathComponent:[appDelegate.currentIssue getIssueDirectoryName ]];
    }else {
        baseURL = [[NSURL URLWithString:dirName] URLByAppendingPathComponent:[appDelegate.currentIssue getIssueDirectoryName]];
    }

    /* end  BUGFIX: Video does not work on iOS 5.0 */

    NSURL *videoURL = [baseURL URLByAppendingPathComponent:videoName];    


    MPMoviePlayerController * movieController= [[MPMoviePlayerController alloc]initWithContentURL:videoURL];

    // set frame for player
    movieController.view.frame = rect;

    // set  auto resizing masks
    [movieController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];

    // don't auto play.
    [movieController setShouldAutoplay:NO];

    [movieController setUseApplicationAudioSession:YES];

    /*
     BUGFIX: Video does not work on iOS 5.0
     */
    if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"5.0")) {
        [movieController prepareToPlay];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadVideo:) name:MPMoviePlayerLoadStateDidChangeNotification object:movieController];  
    }else {
        [pdfView addSubview:movieController.view];
        [pdfView bringSubviewToFront: movieController.view];
    }

    /* end  BUGFIX: Video does not work on iOS 5.0 */

    [_moviePlayerViewControllerArray addObject:movieController];
    [movieController release];
    [pool release];
}

обработчик уведомлений:

-(void)loadVideo:(NSNotification*)notification {

    for (MPMoviePlayerController *movieController in _moviePlayerViewControllerArray) {

        if (movieController.loadState != MPMovieLoadStateUnknown) {


            [pdfView performSelectorOnMainThread:@selector(addSubview:) withObject:movieController.view waitUntilDone:YES];
            [pdfView performSelectorOnMainThread:@selector(bringSubviewToFront:) withObject:movieController.view waitUntilDone:YES];
            [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:movieController];
        }
    }

}

Спасибо за чтение этого огромного вопроса.Я ценю ваши ответы.

ура.

Ответы [ 2 ]

13 голосов
/ 05 марта 2012

Попробуйте это: Установите для свойства «useApplicationAudioSession» свойства MPMoviePlayerController значение «НЕТ».

8 голосов
/ 31 октября 2011

Очевидно, есть ошибка, но она связана не с MPMoviePlayerController, а с самой iOS 5.

Мой iPad был отключен от переключателя, но все равно воспроизводил звук из приложения iPod, так что я не понял, чтотак было, поэтому MPMoviePlayerController был в порядке, но часть ОС не заметила, что iPad отключен.

Я обнаружил соответствующую ошибку на устройстве отслеживания ошибок Apple.Идентификатор ошибки # 10368531.

Прошу прощения, если я потратил впустую ваше время.

ОБНОВЛЕНИЕ: Получил отзыв от Apple об ошибке.Это ожидаемое поведение.: \

...