在iOS应用中模拟闪屏视频

11

好的,在iOS中模拟启动画面的选项非常有限。我们所能做的就是等待应用程序完全加载,然后创建媒体播放器并在其中加载视频。

我使用以下代码来实现它:

-(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 ...>

}

我的视频只有1MB,但是这段代码却展示的与我想要的不同:

  1. 首先,用户可以看到静态闪屏几秒钟。
  2. 然后黑屏出现了1到2秒。我认为这是因为媒体播放器被加载了。
  3. 视频开始播放。
  4. 主界面加载。

正如您所理解的那样,我不喜欢黑屏暂停-它看起来很丑陋。

据我在控制台日志中看到的,问题在于媒体播放器等待主视图控制器完全加载。

关于主视图的几句话:我正在为iPad编写一个应用程序,主视图由多个带有多个图像的子视图组成。主视图中的每个图像和每个子视图都通过ASIHTTPRequest库从Internet Web服务加载一些数据。

我认为媒体播放器正在等待所有初始连接完成,然后才开始播放视频...

我怎么才能在主视图加载之前强制播放视频?或者我可以延迟加载主XIB吗?

3个回答

13
您无法摆脱静态启动画面。在此期间,操作系统正在加载应用程序并实例化内容,直到准备好调用UIApplicationDelegate。因此,您只能使用无闪屏(黑屏几秒钟)或使电影正好从显示的启动画面开始,以便看起来像静态图像突然动画。

要消除电影加载时的黑屏,请尝试使播放器透明,并在播放器后面放置一个UIImageView,显示闪屏图像。行为将是这样的:

  • 显示闪屏(静态图像)。
  • 应用程序已加载。您可以看到UIImageView,它也显示闪屏。在其上方是透明的电影播放器。
  • 电影播放器最终加载了电影并开始播放。

至少在理论上,这应该导致静态图像突然开始动画的效果。

但是,如果您根本不使用闪屏(许多游戏都这样做),那么电影播放器一开始显示黑屏也无所谓,您不会注意到。

关于在UIImageView中显示闪屏:不幸的是,您必须测试接口旋转并手动加载图像,没有办法查询显示了哪个闪屏。如果您仅支持一个界面方向(同样,许多游戏都这样做),则当然没有此问题。


谢谢,我认为这是最好的解决方法 :) 尽管我不明白为什么玩家要等待所有连接... - WASD42

10

现在有一种更好的解决方案,假设你正在使用UIViewControllers。

不要使用MPMoviePlayerController,而是使用MPMoviePlayerViewController。这里是一些示例代码,改编自这个问题:

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

}


这是一个HTML标签,其中包含了右大括号“}”。它可能是某个程序代码的一部分,但没有上下文信息,因此无法确定其确切含义。

4
这对我很有效,唯一的问题是应用启动时,window.rootViewController为空,因此在其上调用addSubview不会有任何效果。结果,您可以听到视频但看不到它。要解决此问题,请使用以下代码替换该addSubview行:“window.rootViewController = moviePlayer;”然后在moviePlayBackDidFinish方法中将其重新分配为您希望在电影播放完成后成为根视图控制器的任何内容。 - Joe Strout
1
我也试过了,但是我必须将moviePlayer视图框架设置为与rootViewController视图框架匹配,以消除自动调整大小警告消息。 - Brainware

0

iOS应用中的模拟启动视频这段代码适用于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()
     }

MPMoviePlayerController已被弃用,请使用AVPlayerViewController。http://pinkstone.co.uk/how-to-play-videos-in-ios-9 - Kegham K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接