Странное поведение при запуске MPMoviePlayerController в viewDidLoad - PullRequest
3 голосов
/ 21 августа 2011

Я использую MediaPlayer framework , чтобы воспроизвести довольно крупный фильм (~ 200 МБ), как только мое приложение будет запущено. Когда я пытался воспроизвести видео на моем viewDidLoad, точки останова указывали, что представление было добавлено, однако видео не показывалось на устройстве.

Затем я настроил кнопку, чтобы убедиться, что видео работает . Запуск IBAction с кнопки не показал никаких проблем.

Итак, я был в тупике. И мне было интересно, связано ли это с тем, что видео вызывалось сразу после запуска приложения. Поэтому я добавил NSTimer с задержкой в ​​пять секунд к вызову viewDidLoad. И вот, все работало нормально. Кто-нибудь может пролить свет на то, почему видео не будет воспроизводиться, если нет начальной задержки? Код ниже.

- (void)viewDidLoad {
      NSTimer *currentTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(playMovie) userInfo:nil repeats:NO];
        [[NSRunLoop mainRunLoop] addTimer:currentTimer forMode:NSRunLoopCommonModes];
      [super viewDidLoad];
}

-(IBAction)playMovie
{  
    NSString *filepath   =   [[NSBundle mainBundle] pathForResource:@"Speed" ofType:@"mov"];  
    NSURL    *fileURL    =   [NSURL fileURLWithPath:filepath];  
    MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];  

    [[NSNotificationCenter defaultCenter] addObserver:self  
                                             selector:@selector(moviePlaybackComplete:)  
                                                 name:MPMoviePlayerPlaybackDidFinishNotification  
                                               object:moviePlayerController];  

    [self.view addSubview:moviePlayerController.view];  
    moviePlayerController.fullscreen = YES;  
    [moviePlayerController play]; 
}  

Ответы [ 3 ]

10 голосов
/ 29 августа 2011

Попробуйте воспроизвести фильм в viewDidAppear: вместо viewDidLoad. В точке вызова viewDidLoad представление еще не находится в иерархии представлений. Вы все еще можете создать MPMoviePlayerController в viewDidLoad, просто не воспроизводите его, пока вид не появится.

1 голос
/ 30 августа 2011

Я думаю, что размер видео здесь есть чем заняться. Я попытался сделать то же самое с меньшим видео, и оно отлично работает. Кажется, что видео сначала загружается, а затем воспроизводится (см. Этот вопрос о стеке: MPMoviePlayerController не показывает элементы управления, пока видео не загружено ). Очевидно, 200 МБ видео занимает 4-5 секунд для предварительной загрузки. Попробуйте код, который не работал с видео меньшего размера. Если он работает нормально, то это определенно проблема с размером.

Редактировать: Я нашел это в Справочник по классам MPMoviePlayerController" Если вам известен тип источника фильма, установка значения этого свойства перед началом воспроизведения может улучшить время загрузки содержимого фильма Если вы не устанавливаете тип источника явно перед воспроизведением, контроллер проигрывателя фильмов должен собрать эту информацию, что может задержать воспроизведение."Я заметил, что вы не объявили тип источника. Добавьте к этому размер видео, и вы получите 4-5 секунд времени загрузки.

Также попробуйте это перед игрой [moviePlayerController prepareToPlay];

0 голосов
/ 03 сентября 2013

У меня был другой опыт, но перемещение кода в viewDidAppear: также помогло моему делу.У меня есть IOS-код, который переходит с одной раскадровки на другую, и после завершения перехода - в viewDidLoad: я инициализировал периодический таймер.Код для таймера ниже [я звонил startTimer в viewDidLoad:]:

// Schedules a new timer, adds it to the current run loop and waits forever.
- (void) startTimer
{
    _timer = [NSTimer scheduledTimerWithTimeInterval: 10.0
                                              target:self
                                            selector:@selector(request)
                                            userInfo:nil
                                             repeats:YES];
//    [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
//    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
}

Интересно то, что когда я вызываю startTimer в viewDidLoad: я никогда не могу наблюдать вид напереход iPhone на следующий контроллер - я вижу оператор NSLog, который показывает, что элемент управления пришел к

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

, но элемент управления не переходит к ViewController.

Это поведение не зависит отвремя периодического таймера - установка низкого или высокого значения не влияет на проблему.Наблюдаемая проблема исчезает, когда я перемещаю вызов startTimer на viewDidAppear:


Это сопровождается другим набором вызовов, даже когда я перемещаю код таймера на viewDidAppear:.Этот код наличия обычного таймера - я создал его, чтобы получить значение RSSI для Bluetooth-соединения с низким энергопотреблением.Что я заметил, так это то, что я перестал получать обратные вызовы делегатов для делегата Bluetooth.

...