2011-08-13 15 views
9

ठीक है, आईओएस में स्पलैश वीडियो अनुकरण करने के लिए बहुत कम विकल्प हैं। हम सब कुछ कर सकते हैं जब तक कि एप्लिकेशन पूरी तरह से लोड नहीं हो जाता है और फिर मीडिया प्लेयर बनाएं और इसमें वीडियो लोड करें।आईओएस एप्लिकेशन में स्पलैश वीडियो इम्युलेटिंग

मैं निम्नलिखित कोड के साथ इसे लागू किया:

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

} 

मेरे वीडियो में केवल 1 एमबी है। लेकिन यह कोड कुछ अलग करता है तो मैं देखना चाहता हूं:

  1. सबसे पहले उपयोगकर्ता कुछ सेकंड के लिए एक स्थिर स्पलैश स्क्रीन देख सकते हैं;
  2. फिर 1 या 2 सेकंड के लिए एक काली स्क्रीन दिखाई देती है। मुझे लगता है कि यह हो रहा है क्योंकि मीडिया प्लेयर लोड हो गया है।
  3. वीडियो बजाना शुरू करें।
  4. मुख्य इंटरफ़ेस भार।

जैसा कि आप समझते हैं कि मुझे ब्लैक स्क्रीन के साथ रोकना पसंद नहीं है - यह बदसूरत लग रहा है।

जहां तक ​​मैं अपने कंसोल लॉग में देख सकता हूं, समस्या यह है कि मुख्य दृश्य नियंत्रक पूरी तरह से लोड होने तक mediaplayer प्रतीक्षा कर रहा है।

मुख्य दृश्य के बारे में कुछ शब्द: मैं आईपैड के लिए एक आवेदन लिख रहा हूं और मुख्य दृश्य में कई छवियों के साथ कई सबव्यूव शामिल हैं। मुख्य दृश्य में प्रत्येक छवि और प्रत्येक सबव्यू ASIHTTPRequest lib के माध्यम से इंटरनेट वेब सेवा से कुछ डेटा लोड करता है।

मुझे लगता है कि मीडिया प्लेयर सभी प्रारंभिक कनेक्शन समाप्त करने के लिए इंतज़ार कर रहा है और उसके बाद ही यह वीडियो शुरू करना है ...

कैसे मैंने पहले मुख्य दृश्य लोड किया जाता है खेलने के लिए वीडियो के लिए मजबूर कर सकते हैं? या शायद मैं मुख्य XIB की लोडिंग में देरी कर सकता हूं?

उत्तर

11

आप स्थैतिक स्पलैश छवि से छुटकारा नहीं पा सकते हैं। हालांकि यह दिखाया गया है, ओएस एप्लिकेशन को लोड कर रहा है और सामान को तत्काल नहीं कर रहा है जब तक कि यह आपके यूआईएप्लिकेशन डिलीगेट को कॉल करने के लिए तैयार न हो। तो आप जो भी कर सकते हैं या तो कोई स्प्लैश (कुछ सेकंड के लिए ब्लैक स्क्रीन) का उपयोग करें या अपनी फिल्म को दिखाए गए स्प्लैश स्क्रीन के साथ बिल्कुल शुरू करें ताकि ऐसा लगता है कि स्थैतिक छवि अचानक एनिमेट हो जाएगी।

मूवी लोड करते समय ब्लैक स्क्रीन से छुटकारा पाने के लिए, आप make the player transparent पर आज़मा सकते हैं और स्प्लैश छवि दिखाते हुए प्लेयर के पीछे UIImageView कर सकते हैं। व्यवहार यह होगा:

  • स्पलैश स्क्रीन दिखाया गया है (स्थैतिक छवि)।
  • एप्लिकेशन लोड हो गया है। आप UIImageView देखते हैं, स्प्लैश स्क्रीन भी दिखाते हैं। इसके ऊपर पारदर्शी फिल्म प्लेयर है।
  • मूवी प्लेयर ने आखिरकार इस कदम को लोड किया है और इसे खेलना शुरू कर दिया है।

कम से कम सिद्धांत में, इस प्रभाव का कारण होना चाहिए कि स्थैतिक छवि अचानक एनिमेटिंग शुरू हो जाती है।

लेकिन यदि आप स्प्लैश स्क्रीन का उपयोग नहीं करते हैं (बहुत सारे गेम ऐसा करते हैं), तो इससे कोई फर्क नहीं पड़ता कि मूवी प्लेयर पहले ब्लैक स्क्रीन दिखा रहा है, आपको नोटिस नहीं होगा।

UIImageView में स्प्लैश स्क्रीन दिखाने के संबंध में: दुर्भाग्य से, you have to test the interface rotation and load the image manually, यह पूछने का कोई तरीका नहीं है कि कौन सा स्पलैश स्क्रीन दिखाया गया था।यदि आप केवल एक इंटरफ़ेस अभिविन्यास का समर्थन करते हैं (फिर से, बहुत सारे गेम ऐसा करते हैं) तो आपको निश्चित रूप से यह समस्या नहीं है।

+0

इस कोड को धन्यवाद, मुझे लगता है कि लगता है: यहां कुछ नमूना कोड, सवाल से अनुकूलित है यह एक अच्छा कामकाज है :) हालांकि मुझे समझ में नहीं आता कि खिलाड़ी सभी कनेक्शन के लिए क्यों इंतजार कर रहा है ... – 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]; 

} iOS के आवेदन में

+4

यह मेरे लिए अच्छी तरह से काम करता है, सिवाय इसके कि ऐप लॉन्च पर, window.rootViewController शून्य है, इसलिए addSubview को कॉल करना यह कुछ भी नहीं करता है। नतीजतन, आप वीडियो सुन सकते हैं, लेकिन इसे नहीं देख सकते हैं। इसे ठीक करने के लिए, उस addSubview लाइन को इसके साथ प्रतिस्थापित करें: "window.rootViewController = moviePlayer;" ... और फिर अपनी मूवी प्लेबैकडिडफिनिश विधि में, फिल्म के पूरा होने के बाद जो भी आप चाहते हैं, उसके रूट व्यू कंट्रोलर को फिर से सौंपें। –

+1

मेरे लिए भी काम किया। लेकिन, मुझे एक ऑटोरेसाइजिंग चेतावनी संदेश से छुटकारा पाने के लिए rootViewController व्यू फ्रेम से मेल खाने के लिए मूवीप्लेयर व्यू फ्रेम सेट करना पड़ा। – Brainware

0

नकल छप वीडियो के लिए 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() 
    } 
संबंधित मुद्दे