2011-08-13 13 views
9

OK, istnieje bardzo niewiele opcji emulacji powitania wideo w systemie iOS. Wszystko, co możemy zrobić, to poczekać, aż aplikacja zostanie w pełni załadowana, a następnie utworzyć Media Player i załadować wideo.Emulacja wideo powitalnego w aplikacji iOS

I wdrożone go z następującym kodem:

-(void) moviePlayBackDidFinish:(NSNotification*)notification 
{ 
    NSLog(@"Intro video stopped"); 
    [mMoviePlayer release]; 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSURL* mMovieURL; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    if(bundle != nil) 
    { 
     NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"]; 
     if (moviePath) 
     { 
      mMovieURL = [NSURL fileURLWithPath:moviePath]; 
      [mMovieURL retain]; 
     } 
    } 

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mMovieURL]; 
    [mMovieURL release]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:mMoviePlayer]; 

    mMoviePlayer.controlStyle = MPMovieControlStyleNone; 
    [mMoviePlayer.backgroundView addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Splash/background.png"]] autorelease]]; 
    mMoviePlayer.scalingMode = MPMovieScalingModeFill; 

    [window addSubview:mMoviePlayer.view]; 
    [mMoviePlayer setFullscreen:YES animated:NO]; 

    [window makeKeyAndVisible]; 
    [mMoviePlayer play]; 

<... other stuff ...> 

} 

Mój film jest tylko 1 MB. Ale ten kod robi coś innego niż chciałbym zobaczyć:

  1. Przede wszystkim użytkownik może zobaczyć statyczny ekran powitalny przez kilka sekund;
  2. Następnie pojawia się czarny ekran przez 1 lub 2 sekundy. Myślę, że tak się dzieje, ponieważ odtwarzacz multimediów jest załadowany.
  3. Rozpocznij odtwarzanie wideo.
  4. Ładowanie głównego interfejsu.

Jak rozumiesz, nie podoba mi się przerwa z czarnym ekranem - wygląda brzydko.

O ile widzę w moim dzienniku konsoli, problem polega na tym, że mediaplayer czeka, aż główny kontroler widoku zostanie w pełni załadowany.

Kilka słów o głównym widoku: piszę aplikację na iPada, a główny widok składa się z kilku subviews z wieloma obrazami. Każdy obraz i każdy widok podrzędny w widoku głównym ładuje niektóre dane z internetowej usługi sieci Web za pośrednictwem biblioteki ASIHTTPRequest.

myślę, że Media Player czeka na wszystkie początkowe połączenia do końca i dopiero wtedy zaczyna się film ...

Jak mogę zmusić film grać przed głównym widoku jest ładowany? A może mogę opóźnić załadowanie głównego XIB?

Odpowiedz

11

Nie można pozbyć się statycznego obrazu powitalnego. Mimo że jest on wyświetlany, system operacyjny ładuje aplikację i tworzy instancję, dopóki nie będzie gotowy do wywołania metody UIApplicationDelegate. Więc możesz zrobić tylko albo bez splash (czarny ekran przez kilka sekund), albo zacząć film dokładnie od pokazanego ekranu powitalnego, żeby wyglądało, jakby statyczny obraz nagle się ożywiał.

Aby pozbyć się czarnego ekranu podczas ładowania filmu, można spróbować uzyskać make the player transparent i mieć UIImageView za odtwarzaczem, który pokazuje obraz powitalny. Zachowanie będzie następujące:

  • Wyświetlany jest ekran powitalny (obraz statyczny).
  • Aplikacja została załadowana. Zobaczysz UIImageView, pokazujący również ekran powitalny. Na dodatek jest przezroczysty odtwarzacz filmów.
  • Odtwarzacz filmów wreszcie załadował ruch i zaczął go odtwarzać.

Przynajmniej w teorii powinno to spowodować efekt, że nagle zacznie się animować nieruchomy obraz.

Ale jeśli w ogóle nie korzystasz z ekranu powitalnego (wiele gier to robi), to nie ma znaczenia, że ​​odtwarzacz filmów pokazuje na początku czarny ekran, którego nie zauważysz.

Jeśli chodzi o wyświetlanie ekranu powitalnego w UIImageView: niestety, you have to test the interface rotation and load the image manually, nie ma możliwości sprawdzenia, który ekran powitalny został wyświetlony.Jeśli obsługujesz tylko jedną orientację interfejsu (znowu, wiele gier to robi), oczywiście nie masz tego problemu.

+0

Dziękuję, myślę, że to najlepszy sposób obejścia :) Chociaż nie mogę zrozumieć, dlaczego gracz czeka na wszystkie połączenia ... – WASD42

10

Istnieje teraz lepsze rozwiązanie, zakładając, że używasz kontrolerów UIViewController.

Zamiast korzystać z MPMoviePlayerController, użyj MPMoviePlayerViewController. Oto przykładowy kod, zaadaptowany z pytaniem:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSURL* mMovieURL; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    if(bundle != nil) 
    { 
     NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"]; 
     if (moviePath) 
     { 
      mMovieURL = [NSURL fileURLWithPath:moviePath]; 
      [mMovieURL retain]; 
     } 
    } 

    mMoviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:mMovieURL]; 
    [mMovieURL release]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:mMoviePlayer.moviePlayer]; 
    mMoviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone; 
    [mMoviePlayer.moviePlayer.backgroundView addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SplashCopy.png"]] autorelease]]; 
    mMoviePlayer.moviePlayer.scalingMode = MPMovieScalingModeFill; 
    [window.rootViewController.view addSubview:mMoviePlayer.moviePlayer.view]; 
    [mMoviePlayer.moviePlayer setFullscreen:YES animated:NO]; 
    [mMoviePlayer.moviePlayer play]; 

}

+4

To działało ładnie dla mnie, z wyjątkiem tego, że przy uruchomieniu aplikacji window.rootViewController jest zerowe, więc wywołanie addSubview na nic nie robi. W rezultacie można było usłyszeć wideo, ale go nie widać. Aby to naprawić, zamień linię addSubview na: "window.rootViewController = moviePlayer;" ... a następnie w metodzie moviePlayBackDidFinish, ponownie przypisz to do tego, co chcesz, aby kontroler widoku głównego był po zakończeniu filmu. –

+1

Pracował również dla mnie. Ale musiałem ustawić ramkę widoku MoviePlayer, aby pasowała do ramki widoku rootViewController, aby pozbyć się komunikatu ostrzegającego o automatycznej aktualizacji. – Brainware

0

Emulacja powitalny wideo w aplikacji iOS ten kod swift4.0

 var mMovieURL: URL? 
     let bundle = Bundle.main 
     if bundle != nil { 
      let moviePath: String? = bundle.path(forResource: "intro", ofType: "mp4") 
      if moviePath != nil { 
       mMovieURL = URL(fileURLWithPath: moviePath ?? "") 

      } 
     } 
     mMoviePlayer = MPMoviePlayerController(contentURL: mMovieURL!) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackDidFinish), name: .MPMoviePlayerPlaybackDidFinish, object: mMoviePlayer) 
     mMoviePlayer.controlStyle = .none 
     mMoviePlayer.backgroundView.addSubview(UIImageView(image: UIImage(named: "Splash.png"))) 
     mMoviePlayer.scalingMode = .fill 
     window?.addSubview(mMoviePlayer.view) 
     // window?.rootViewController?.view.addSubview(mMoviePlayer.view) 
     mMoviePlayer.setFullscreen(true, animated: false) 
     window?.makeKeyAndVisible() 
     mMoviePlayer.play() 

     return true 
    } 

    @objc func moviePlayBackDidFinish(_ notification: Notification) { 
     mMoviePlayer.view.removeFromSuperview() 
    }