Как воспроизводить видео в Objective-C - вызывает рывок при загрузке - PullRequest
1 голос
/ 28 февраля 2011

Я занимаюсь разработкой приложения, которое загружает видео во время его запуска.Я наблюдаю огромный рывок во время воспроизведения и удаления видео с экрана.

Мой код выглядит следующим образом:

VideoPlayer.m

-(id)initWithVideo: (CGRect)frame file:(NSString *)videoFile 
{
    if (self = [super initWithFrame:frame]) 
    {
        NSArray *file = [videoFile componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"."]];

        NSString *moviePath = [[NSBundle mainBundle] pathForResource:[file objectAtIndex:0] ofType:[file objectAtIndex:1]];

        if (nil != moviePath) 
        {
            if (nil != theMovie) 
            {
                [theMovie.view removeFromSuperview];
            }

            theMovie = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];

            theMovie.view.frame = self.bounds;
            theMovie.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
            theMovie.moviePlayer.controlStyle = MPMovieControlStyleNone;
            theMovie.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
            theMovie.moviePlayer.fullscreen = NO;           

            [self addSubview:theMovie.view];            
        }
    }

    return self;
}

Пожалуйста, ведите меня туда, где мне не хватает этого.

1 Ответ

7 голосов
/ 10 мая 2011
-(void)prepareMoviePlayer:(NSURL *)moviePath {
    self.moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:moviePath];
    if ([[self.moviePlayerViewController moviePlayer] respondsToSelector:@selector(loadState)]) {
      [[self.moviePlayerViewController moviePlayer] setControlStyle:MPMovieControlStyleEmbedded];
      [[self.moviePlayerViewController moviePlayer] setFullscreen:NO];      
      [[self.moviePlayerViewController moviePlayer] prepareToPlay];
      [[NSNotificationCenter defaultCenter] addObserver:self 
                           selector:@selector(moviePlayerLoadStateDidChange:) 
                             name:MPMoviePlayerLoadStateDidChangeNotification 
                             object:nil];
}


- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification {
  if ([[self.moviePlayerViewController moviePlayer] loadState] == MPMovieLoadStateStalled) {
    NSLog(@"Movie Playback Stalled");
  } else if([[self.moviePlayerViewController moviePlayer] loadState] != MPMovieLoadStateUnknown) {

    [[NSNotificationCenter defaultCenter] removeObserver:self
                            name:MPMoviePlayerLoadStateDidChangeNotification
                            object:nil];

    [[[self.moviePlayerViewController moviePlayer] view] setFrame:self.view.bounds];
    [[self view] addSubview:[[self.moviePlayerViewController moviePlayer] view]];     
    [[self.moviePlayerViewController moviePlayer] play];
  }
}

Ключ NSMoviePlayerViewController prepareToPlay представляется здесь ключевым. Я также предлагаю добавить другие уведомления для обработки завершения воспроизведения и остановки воспроизведения. Также часть этого кода предназначена для работы из подпредставления окна.

...