Emulowanie splash video w aplikacji iOS

OK, istnieje bardzo niewiele opcji, aby emulować wideo splash w iOS. Wszystko co możemy zrobić, to poczekać aż aplikacja zostanie w pełni załadowana, a następnie utworzyć odtwarzacz multimedialny i załadować w nim wideo.

Zaimplementowałem go 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 ma tylko 1 MB. Ale ten kod robi cos innego wtedy chcialbym zobaczyc:

  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 to jest dzieje się, ponieważ odtwarzacz multimedialny jest załadowany.
  3. rozpocznij odtwarzanie wideo.
  4. główne obciążenia interfejsu.

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

Z tego co 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 widoku głównym: piszę aplikację na iPada, a widok główny składa się z kilku podwinięć z wieloma obrazami. Każdy obraz i każdy subview w widoku głównym ładuje niektóre dane z serwisu internetowego poprzez asihttprequest lib.

Myślę, że Media Player czeka na zakończenie wszystkich początkowych połączeń i dopiero wtedy zaczyna wideo...

Jak wymusić odtwarzanie wideo przed załadowaniem widoku głównego? A może mogę opóźnić załadowanie głównego XIB?

Author: WASD42, 2011-08-13

3 answers

Nie można pozbyć się statycznego obrazu splash. Podczas gdy jest pokazany, system operacyjny ładuje aplikację i tworzy instancje, dopóki nie będzie gotowy do wywołania Twojej aplikacji UIApplicationDelegate. Wszystko, co możesz zrobić, to albo użyć bez splash (czarny ekran przez kilka sekund), albo sprawić, że film rozpocznie się dokładnie z pokazanym ekranem powitalnym, aby wyglądał, jakby statyczny obraz nagle się ożywił.

Aby pozbyć się czarnego ekranu podczas ładowania filmu, Możesz spróbować uczynić odtwarzacz przezroczystym i mieć Widok UIImageView za odtwarzaczem, który pokazuje obraz splash. Zachowanie byłoby takie:

  • pokazany jest ekran powitalny (obraz statyczny).
  • Aplikacja jest załadowana. Widzisz interfejs użytkownika, pokazując również ekran powitalny. Na szczycie znajduje się przezroczysty odtwarzacz filmów.
  • Movie player w końcu załadował ruch i zaczął go odtwarzać.

Przynajmniej teoretycznie powinno to spowodować, że statyczny obraz nagle zacznie się ożywiać.

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

Jeśli chodzi o wyświetlanie ekranu powitalnego w UIImageView: niestety, musisz przetestować obrót interfejsu i załadować obraz ręcznie , nie ma sposobu na sprawdzenie, który ekran powitalny został wyświetlony. Jeśli obsługujesz tylko jedną orientację interfejsu (znowu, wiele gier tak robi) , nie masz tego problemu, z oczywiście.

 11
Author: DarkDust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:30:23

Istnieje teraz lepsze rozwiązanie, zakładając, że używasz UIViewControllers.

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

- (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];

}

 10
Author: supadenz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 21:44:03

Emulowanie wideo splash w aplikacji iOS 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()
     }
 0
Author: LordWilmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 08:57:57