2011-08-13 8 views
9

OK, có rất ít tùy chọn để mô phỏng video giật gân trong iOS. Tất cả những gì chúng ta có thể làm là chờ cho đến khi ứng dụng được tải đầy đủ và sau đó tạo Media Player và tải video trong đó.Thi đua video giật gân trong ứng dụng iOS

tôi thực hiện nó với đoạn mã sau:

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

} 

Video của tôi là chỉ có 1 MB. Nhưng mã này làm điều gì đó khác biệt sau đó tôi muốn xem:

  1. Trước hết, người dùng có thể thấy màn hình giật tĩnh trong vài giây;
  2. Sau đó, màn hình màu đen xuất hiện trong 1 hoặc 2 giây. Tôi nghĩ điều này đang xảy ra vì trình phát đa phương tiện được tải.
  3. Bắt đầu phát video.
  4. Tải giao diện chính.

Khi bạn hiểu tôi không thích tạm dừng với màn hình đen - có vẻ xấu xí.

Theo như tôi có thể thấy trong bảng điều khiển của tôi đăng nhập vấn đề là mediaplayer đang chờ cho đến khi bộ điều khiển xem chính được nạp đầy đủ.

Vài từ về chế độ xem chính: Tôi đang viết một ứng dụng cho iPad và chế độ xem chính bao gồm một số bản xem trước với nhiều hình ảnh. Mọi hình ảnh và mọi chế độ xem phụ trong chế độ xem chính đều tải một số dữ liệu từ dịch vụ Web Internet qua lib ASIHTTPRequest.

Tôi nghĩ rằng Media Player đang chờ đợi tất cả các kết nối ban đầu để kết thúc và chỉ sau đó nó bắt đầu video ...

Làm thế nào tôi có thể buộc các video phát trước khi giao diện chính được nạp? Hoặc có lẽ tôi có thể trì hoãn việc tải XIB chính?

Trả lời

11

Bạn không thể thoát khỏi hình ảnh giật gân tĩnh. Trong khi nó được hiển thị, hệ điều hành đang tải các ứng dụng và instantiating công cụ cho đến khi nó đã sẵn sàng để gọi UIApplicationDelegate của bạn. Vì vậy, tất cả những gì bạn có thể làm là sử dụng không giật gân (màn hình đen trong vài giây) hoặc làm cho phim của bạn bắt đầu chính xác với màn hình hiển thị giật gân, vì vậy có vẻ như hình ảnh tĩnh sẽ đột nhiên hoạt ảnh.

Để thoát khỏi màn hình màu đen trong khi phim tải, bạn có thể thử make the player transparent và có UIImageView phía sau trình phát hiển thị hình ảnh giật gân. Hành vi sẽ là:

  • Màn hình Splash được hiển thị (hình ảnh tĩnh).
  • Ứng dụng được tải. Bạn thấy UIImageView, cũng hiển thị màn hình giật gân. Trên đầu trang của nó là trình phát phim trong suốt.
  • Trình phát phim cuối cùng đã tải di chuyển và bắt đầu phát.

Ít nhất trong lý thuyết, điều này sẽ gây ra hiệu ứng hình ảnh tĩnh đột nhiên bắt đầu hoạt ảnh.

Nhưng nếu bạn không sử dụng màn hình giật gân (rất nhiều trò chơi làm điều đó), thì đầu tiên, không quan trọng là trình phát phim đang hiển thị màn hình đen, bạn sẽ không nhận thấy.

Về hiển thị màn hình giật trong UIImageView: thật không may, you have to test the interface rotation and load the image manually, không có cách nào để truy vấn màn hình giật gân nào được hiển thị.Nếu bạn chỉ hỗ trợ một giao diện định hướng (một lần nữa, rất nhiều trò chơi làm điều này) bạn không có vấn đề này, tất nhiên.

+0

Cảm ơn bạn, tôi nghĩ rằng đó là một giải pháp tốt nhất :) Mặc dù tôi không thể hiểu tại sao người chơi đợi tất cả các kết nối ... – WASD42

10

Hiện có giải pháp tốt hơn, giả sử bạn đang sử dụng UIViewControllers.

Thay vì sử dụng MPMoviePlayerController, hãy sử dụng MPMoviePlayerViewController. Dưới đây là một số mẫu mã, chuyển thể từ câu hỏi:

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

Điều này làm việc tốt cho tôi, ngoại trừ lúc khởi chạy ứng dụng, window.rootViewController là không, vì vậy hãy gọi addSubview trên nó không làm gì cả. Kết quả là, bạn có thể nghe thấy video, nhưng không nhìn thấy nó. Để khắc phục điều này, hãy thay thế dòng addSubview đó bằng: "window.rootViewController = moviePlayer;" ... và sau đó trong phương thức moviePlayBackDidFinish của bạn, gán lại cho bất kỳ thứ gì bạn muốn bộ điều khiển chế độ xem gốc của mình sau khi phim được hoàn thành. –

+1

Làm việc cho tôi. Nhưng, tôi đã phải đặt khung xem phimPlayer để phù hợp với khung nhìn rootViewController để loại bỏ một thông điệp cảnh báo tự động hóa. – Brainware

0

thi đua phim giật gân trong ứng dụng iOS mã này cho 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() 
    }