2012-08-29 38 views
12

से चयनित आइटम चलाएं मैं एक टीवी-शो खेल रहा हूं जिसे AVQueuePlayer का उपयोग करके मेरे प्रोजेक्ट पर अलग-अलग अध्यायों में काटा गया है। मैं पिछले/अगले अध्याय को छोड़ने या फ्लाई पर एक अलग अध्याय चुनने की संभावना भी प्रदान करना चाहता हूं, जबकि AVQueuePlayer पहले ही खेल रहा है।AVQueuePlayer पर पिछला AVPlayerItem पर जाएं/कतार

अगले आइटम पर जाएं AVQueuePlayer द्वारा प्रदान किए गए advanceToNextItem के साथ कोई समस्या नहीं है, लेकिन कतार से वापस जाने या एक निश्चितता को खेलने के लिए कुछ भी नहीं है।

तो मैं काफी यकीन है कि यहाँ क्या सबसे अच्छा तरीका हो सकता है नहीं कर रहा हूँ:,

  1. AVQueuePlayer के बजाय एक AVPlayer का उपयोग nextItem खेलने के लिए actionAtItemEnd पर replaceCurrentItemWithPlayerItem: आह्वान और बस उपयोगकर्ता का चयन करने के लिए 'replaceCurrentItemWithPlayerItem' का उपयोग एक निश्चित अध्याय

या

  1. कतार या मौजूदा खिलाड़ी पुनर्निर्माण 'का उपयोग करके insertItem: afterItem: 'और' removeAllItems '

अतिरिक्त जानकारी: मैं बटन दबाकर क्रम में वे एक NSArray में दिखाई देनी चाहिए में विभिन्न वीडियो उपयोगकर्ता कुछ अध्यायों के लिए कूद माना जाता है के लिए पथ की दुकान है कि अध्याय का प्रतिनिधित्व करें। बटन में टैग हैं, जो सरणी में संबंधित वीडियो की अनुक्रमणिका भी हैं।

आशा है कि मैं खुद को स्पष्ट कर सकता हूं? किसी को भी इस स्थिति के साथ कोई अनुभव है? यदि कोई जानता है कि एक अच्छा आईओएस वीडियोप्लेयरफ्रेमवर्क कहां खरीदें, जो कार्यक्षमता प्रदान करता है, तो मैं लिंक की भी सराहना करता हूं।

+2

यह मुझे fascinates कि AVQueuePlayer के लिए सूचकांक विधि पर आइटम की तलाश नहीं है। – Morkrom

+0

क्या मैं अभी पूछ सकता हूं, क्या आपके पास यह देखने के लिए कस्टम नियंत्रण थे कि उपयोगकर्ता ने दबाया या क्या आपने AVQeuePlayer पर डिफ़ॉल्ट नियंत्रण से अगले बटन प्रेस का पता लगाने का प्रबंधन किया था? – schmru

उत्तर

20

यदि आप चाहते हैं कि आपका प्रोग्राम पिछले आइटम को चला सके और चयनित प्लेयर को अपने प्लेयरिटैम्स (एनएसएआरएआरई) से चलाएं, तो आप यह कर सकते हैं।

- (void)playAtIndex:(NSInteger)index 
{ 
    [player removeAllItems]; 
    for (int i = index; i <playerItems.count; i ++) { 
     AVPlayerItem* obj = [playerItems objectAtIndex:i]; 
     if ([player canInsertItem:obj afterItem:nil]) { 
     [obj seekToTime:kCMTimeZero]; 
     [player insertItem:obj afterItem:nil]; 
     } 
    } 
} 

संपादित करें: playerItems NSMutableArray (NSArray) जहाँ आप अपने AVPlayerItems की दुकान है।

+0

धन्यवाद। मैं ऐसा कुछ कर रहा था। लेकिन अंत में मैं केवल एक वीडियोफाइल का उपयोग कर समाप्त हुआ और अध्यायों के शुरुआती समय के लिए पॉइंटर्स के साथ एक सरणी और खोज करने के लिए खोज। – Amandir

+1

यदि आप अंतहीन खेलना चाहते हैं, तो आपका समाधान ऐसा करने का एकमात्र तरीका लगता है। – saiday

+1

क्या कतार को साफ़ किए बिना ऐसा करने का कोई तरीका है? –

4

पहला उत्तर AVQueuePlayer से सभी आइटम हटा देता है, और इंडेक्स तर्क के रूप में पारित पुनरावृत्ति के साथ शुरू होने वाली कतार को दोहराता है। यह पिछले आइटम के साथ नई आबादी वाली कतार शुरू करेगा (माना जाता है कि आपने सही इंडेक्स पारित किया है) साथ ही साथ मौजूदा प्लेयर में शेष आइटम उस बिंदु से आगे की सरणी है, लेकिन यह एकाधिक रिवर्स के लिए अनुमति नहीं देता है, उदा। आप ट्रैक 10 पर हैं और वापस जाना चाहते हैं और ट्रैक 9 को फिर से चलाएं, फिर ट्रैक 5 को फिर से चलाएं, ऊपर के साथ आप पूरा नहीं कर सकते हैं। लेकिन यहां आप कर सकते हैं ...

-(IBAction) prevSongTapped: (id) sender 
{ 
    if (globalSongCount>1){ //keep running tally of items already played 
    [self resetAVQueue]; //removes all items from AVQueuePlayer 

     for (int i = 1; i < globalSongCount-1; i++){ 
      [audioQueuePlayer advanceToNextItem]; 
     } 
    globalSongCount--; 
    [audioQueuePlayer play]; 


    } 
} 
2

निम्नलिखित कोड आपको अपने किसी भी आइटम पर जाने की अनुमति देता है। कोई खिलाड़ी नहीं बढ़ रहा है। सादा और सरल। playerItemList AVPlayerItem ऑब्जेक्ट्स के साथ आपका एनएसएआरएआरई है।

- (void)playAtIndex:(NSInteger)index 
{ 
    [audioPlayer removeAllItems]; 
    AVPlayerItem* obj = [playerItemList objectAtIndex:index]; 
    [obj seekToTime:kCMTimeZero]; 
    [audioPlayer insertItem:obj afterItem:nil]; 
    [audioPlayer play]; 
} 
+0

यह समझ में आता है। लेकिन फिर जब भी आप उस अनुक्रमित गीत को खेलना चाहते हैं तो आप सूची से सब कुछ हटा रहे हैं। इस मामले में केवल AVPlayer का उपयोग क्यों न करें? मैंने आपको +1 वोट दिया हालांकि –

2

djiovannAVQueuePlayer का एक उपवर्ग है कि वास्तव में यह सुविधा प्रदान करता है बनाया।

आप इसे github पर पा सकते हैं।

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन कोड के माध्यम से ब्राउज़ करने से ऐसा लगता है कि यह काम पूरा हो गया है। इसके अलावा कोड अच्छी तरह से प्रलेखित है, इसलिए इसे कम से कम कार्यक्षमता के कस्टम कार्यान्वयन के लिए एक अच्छा संदर्भ के रूप में कार्य करना चाहिए (हालांकि मैं subclassing के बजाय एक श्रेणी का उपयोग करने का सुझाव देता हूं)।

0

यदि आप AVQueuePlayer का उपयोग कर किसी भी इंडेक्स से गाना बजाना चाहते हैं। तो यह नीचे कोड मदद कर सकता है।

NSMutableArray *musicListarray(add song that you want to play in queue); 
AVQueuePlayer *audioPlayer; 
AVPlayerItem *item; 


    -(void)nextTapped { 

     nowPlayingIndex = nowPlayingIndex+1; 

     if(nowPlayingIndex > musicListarray.count) { 
     } 
     else{ 
     [self playTrack]; 
     } 
    } 


    -(void)playback { 

    if (nowPlayingIndex < 0) { 
    } 
    else { 
     nowPlayingIndex = nowPlayingIndex -1; 
     [self playTrack]; 
    } 

} 

-(void)playTrack{ 

@try { 
    if (musicArray.count > 0) { 
     item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:musicListarray[nowPlayingIndex]]]; 
     [audioPlayer replaceCurrentItemWithPlayerItem:item]; 
     [audioPlayer play]; 

    } 

} @catch (NSException *exception) { 

} 
} 


    -(void)PlaySongAtIndex{ 
    //yore code... 
     nowPlayingIndex = i(stating index from queue) 
     [audioPlayer play]; 
     [self playTrack]; 
    } 

यहां जब आप एक गीत खेलना चाहते हैं तो PlaySongAtIndex कॉल करें।