2012-01-31 11 views
6

मेरे पास एक ऐप है जो नेट से वीडियो स्ट्रीम करता है और डिवाइस पर या एयरप्ले के माध्यम से MPMoviePlayerController ऑब्जेक्ट का उपयोग करके इसे चलाता है।पृष्ठभूमि मीडिया प्लेबैक के दौरान MPMoviePlayerController अधिसूचनाओं का जवाब

ऐप पृष्ठभूमि ऑपरेशन का समर्थन करता है और इसके प्लेलिस्ट फ़ाइल में आवश्यक UIBackgroundModes कुंजी के भीतर सूचीबद्ध 'ऑडियो' विकल्प है।

एयरप्ले पर खेलते समय, ऐप को पृष्ठभूमि में सफलतापूर्वक धक्का दिया जा सकता है और वीडियो ठीक से खेलना जारी रखता है। अब तक सब ठीक है.

Apple documentation के अनुसार:

ऑडियो कुंजी सहित प्रणाली चौखटे कि वे खेल जारी रखने के लिए और उचित अंतराल पर अनुप्रयोग के लिए आवश्यक कॉलबैक बनाना चाहिए बताता है। यदि ऐप में यह कुंजी शामिल नहीं है, तो ऐप द्वारा चलाए जाने वाले किसी भी ऑडियो ऐप को पृष्ठभूमि पर ले जाने पर रोकता है।

हालांकि, इन कॉलबैक नहीं किए जा रहे हैं। सूचनाएं MPMoviePlayerController और AVPlayer से जुड़े लोगों टाइमर आधारित कॉलबैक कि निरीक्षण के उद्देश्य से प्लेबैक स्थिति और प्रदर्शन आंकड़ों पर नजर रखने के साथ एक साथ प्लेबैक के दौरान भेजें:

एप्लिकेशन कॉलबैक के दो प्रकार का उपयोग करता है।

एप्पल के नोटों को देखते हुए, मैं निश्चित रूप से इतना है कि एप्लिकेशन MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerPlaybackDidFinishNotification और MPMoviePlayerLoadStateDidChangeNotification का जवाब दे सकते कॉलबैक का पहला प्रकार प्राप्त करने की अपेक्षा है, लेकिन ऐसा नहीं होता है।

क्या किसी को पता है कि पृष्ठभूमि एयरप्ले प्लेबैक के दौरान इन्हें प्राप्त करना संभव है और यदि ऐसा है, तो यह कैसे प्राप्त हुआ?

** कृपया ध्यान दें: अग्रभूमि में चलते समय ऐप सही तरीके से काम करता है और नोटिफिकेशन ठीक प्राप्त करता है। यह केवल तभी होता है जब पृष्ठभूमि में धक्का दिया जाता है और एयरप्ले पर खेलता है कि अधिसूचनाएं प्राप्त नहीं होती हैं।

इसी तरह, वीडियो पृष्ठभूमि में एयरप्ले पर ठीक से खेलता है। यह केवल उन अधिसूचनाएं हैं जिन्हें प्राप्त नहीं किया गया है **

उत्तर

0

पूर्णता के लिए, मुझे यह जोड़ना चाहिए कि वर्तमान में मुझे विश्वास है कि इस समस्या का कोई समाधान नहीं है।

मैंने तकनीकी समर्थन के माध्यम से सीधे ऐप्पल के साथ इसकी चर्चा की है और वहां कोई व्यावहारिक कार्य उपलब्ध नहीं था।

ऐप को नियमित अंतराल पर स्ट्रीम के प्लेबैक के बारे में आंकड़े रिकॉर्ड करने की अनुमति देने के लिए यह कार्यक्षमता आवश्यक थी। हालांकि यह ठीक है जब वीडियो डिवाइस की स्क्रीन पर और ऐपप्ले पर वीडियो चलाया जाता है, जबकि ऐप अग्रभूमि में होता है, पृष्ठभूमि में ऐप के साथ ऐसा करना संभव नहीं है।

[UIApplication sharedApplication].idleTimerDisabled = YES; 

और

[UIApplication sharedApplication].idleTimerDisabled = NO; 

इस जबकि:

समाधान मैं बजाय साथ चले गए हैं प्लेबैक के सभी प्रकार के दौरान निष्क्रिय टाइमर निष्क्रिय करने के लिए और का उपयोग कर बाद में पुन: सक्षम करने के लिए है मूल प्रश्न का समाधान नहीं है, यह पहली जगह में इस मुद्दे से बचने के लिए एक कामकाज है।

2

मेरी परियोजनाओं में से एक में मैंने जो किया है, मैंने किया है, और यह मेरे लिए काम करता है। अपने प्रोजेक्ट में दो मतभेद:

  • मैं एयरप्ले द्वारा स्ट्रीमिंग नहीं कर रहा हूँ (डिवाइस प्लेबैक केवल),
  • मैं सिर्फ ऑडियो फ़ाइलें खेल रहा हूँ।

मेरे कदम-दर-कदम:

  • plist फ़ाइल में UIBackgroundModes करने के लिए ऑडियो विकल्प जोड़ें, MPMoviePlayerPlaybackDidFinishNotification और MPMoviePlayerPlaybackStateDidChangeNotification निम्न कोड के साथ के लिए NotificationCenter के लिए
  • रजिस्टर:

    [[NSNotificationCenter defaultCenter] 
           addObserver:self 
            selector:@selector(playbackStateChanged:) 
             name:MPMoviePlayerPlaybackStateDidChangeNotification 
            object:moviePlayer]; 
    
    [[NSNotificationCenter defaultCenter] 
           addObserver:self 
            selector:@selector(playbackEnded:) 
             name:MPMoviePlayerPlaybackDidFinishNotification 
            object:moviePlayer]; 
    

यह एक आकर्षण की तरह काम करता है।

+0

हां, डिवाइस के माध्यम से ऑडियो बजाना ठीक काम करता है। दुर्भाग्यवश, यह एयरप्ले और वीडियो है जिसकी आवश्यकता है मुझे डर है। – reddersky

+0

@virorum यदि आप समीकरण से एयरप्ले को हटाते हैं, तो क्या कॉलबैक कॉल किया जाता है? यदि ऐसा है, तो यह एक ऐप्पल बग की तरह लगता है। अन्यथा शायद एमएमआईसी अपना कोड साझा करने के लिए बहुत दयालु होगा;) – Danra

+0

कॉल फोरग्राउंड में किए जाने पर किया जाता है। यह केवल तब होता है जब पृष्ठभूमि में एयरप्ले पर खेलना होता है जो वे नहीं करते हैं। मुझे लगता है कि यह एक ऐप्पल बात हो सकती है। – reddersky

4

मुझे यह समस्या थी और कुछ महीने पहले हालांकि इसे ठीक कर दिया था। यदि यह काम नहीं करता है तो मैं आपको फिल्म प्लेबैक के लिए अपनी पूरी कक्षा भेज सकता हूं। ध्यान दें कि यह नेविगेशन नियंत्रक मॉडल का उपयोग कर रहा है।

नोट: यह आईपैड 2 पर आईफोन पर परीक्षण नहीं किया गया है।

मैं दिखाने के इस तरह मेरी कुलपति:

- (IBAction)playMovie:(id)sender { 

    MovieVC* movController = [[MovieVC alloc] initWithID:2]; 
    movController.view.backgroundColor = [UIColor blackColor]; 
    AppDelegate *appDel = [[UIApplication sharedApplication] delegate]; 

    [appDel.navigationController pushViewController:movController animated:NO]; 
    [movController release]; 
} 
मेरी MovieVC दृश्य नियंत्रक कक्षा में

तो मैं इस तरह वीडियो प्लेबैक की स्थापना:

- (void)initMoviePlayer { 

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self getMovieURL]]; 

    mMoviePlayer.allowsAirPlay = YES; 

    mMoviePlayer.view.frame = [self.view bounds]; 

    mMoviePlayer.view.backgroundColor = [UIColor clearColor]; 

    mMoviePlayer.shouldAutoplay = YES; 

    mMoviePlayer.fullscreen = YES; 

    mMoviePlayer.scalingMode = MPMovieScalingModeAspectFit; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePreloadDidFinish:) 
              name:MPMoviePlayerLoadStateDidChangeNotification 
              object:mMoviePlayer]; 

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

यह मेरे लिए यह तय हो गई है, अगर यह नहीं करता है टिप्पणी को ठीक नहीं करें और पूरी कक्षा फ़ाइल के साथ बीमार संपादन करें।

+0

हां, ऐप अग्रभूमि में होने पर अधिसूचनाओं को सही ढंग से प्राप्त करता है, लेकिन जब इसे बहु-कार्यशील ऐप के साथ पृष्ठभूमि में धक्का दिया जाता है। – reddersky

+0

@virorum: मूर्खतापूर्ण आवाज के जोखिम पर ठीक है। जब ऐप पृष्ठभूमि में प्रवेश करता है तो क्या ऐप्पल टीवी स्टॉप पर वीडियो प्लेबैक नहीं होता है? कारण मैं पूछता हूं कि जहां तक ​​मुझे जानकारी है और पृष्ठभूमि में एक ऐप पर धागे को रोक दिया जाएगा। कारण यह है कि एक स्नैपशॉट संग्रहीत किया जाता है, एक चलती एप्लिकेशन नहीं, जैसा कि आप डेस्कटॉप मशीन पर प्राप्त करेंगे। इसका अर्थ यह है कि यदि आपके ऐप पर कोई ईवेंट भेजा जाता है तो इसका कोई प्रभाव नहीं पड़ता क्योंकि आपका एप्लिकेशन अधिसूचनाओं को नहीं सुन रहा है। आपको पृष्ठभूमि में प्रवेश करने और फिर अग्रभूमि रजिस्टर में प्रवेश करने पर अधिसूचनाओं के लिए पंजीकरण रद्द करना होगा। – Dev2rights

+0

नहीं :) जैसा कि मैंने सवाल में कहा है, UIBackgroundModes सही ढंग से सेट है और वीडियो ठीक से खेलना जारी रखता है। यह सिर्फ अधिसूचनाएं हैं जो आग नहीं लगती हैं। – reddersky

संबंधित मुद्दे