नहीं AVPlayer प्रतिनिधि? जब गाना बजाना खत्म हो जाए तो कैसे ट्रैक करें? उद्देश्य सी iPhone विकास


84

मैंने चारों ओर देखा है, लेकिन मैं एक प्रतिनिधि प्रोटोकॉल नहीं ढूँढ सकता AVPlayer class। क्या देता है?

मैं इसके उप-वर्ग का उपयोग कर रहा हूं, AVQueuePlayerएक सरणी से खेलने के लिए AVPlayerItems, प्रत्येक URL से लोड किया गया है। क्या कोई तरीका है जब मैं एक गाना बजाने के लिए एक विधि कह सकता हूं? कतार के अंत में विशेष रूप से?

और अगर यह संभव नहीं है, तो क्या कोई ऐसा तरीका है जिसे मैं एक विधि कह सकता हूं जब गीत STARTS बजा रहा हो, बफ़र करने के बाद? मैं वहां एक लोडिंग आइकन प्राप्त करने की कोशिश कर रहा हूं, लेकिन यह वास्तव में संगीत शुरू होने से पहले आइकन को बंद कर देता है, भले ही यह [audioPlayer play]कार्रवाई के बाद हो ।

जवाबों:


152

हां, AVPlayer वर्ग में AVAudioPlayer की तरह एक प्रतिनिधि प्रोटोकॉल नहीं है। आपको AVPlayerItem पर सूचनाओं की सदस्यता लेने की आवश्यकता है। आप उसी URL का उपयोग करके एक AVPlayerItem बना सकते हैं जिसे आप अन्यथा -initWithURL:AVPlayer पर पास करेंगे ।

-(void)startPlaybackForItemWithURL:(NSURL*)url {

    // First create an AVPlayerItem
    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:url];

    // Subscribe to the AVPlayerItem's DidPlayToEndTime notification.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];

    // Pass the AVPlayerItem to a new player
    AVPlayer* player = [[[AVPlayer alloc] initWithPlayerItem:playerItem] autorelease];

    // Begin playback
    [player play]

} 

-(void)itemDidFinishPlaying:(NSNotification *) notification {
    // Will be called when AVPlayer finishes playing playerItem
}

1
itemDidFinishPlaying:बृहदान्त्र के साथ उपयोग करना सुनिश्चित करें । से NSNotificationCenterप्रलेखन: विधि notificationSelector द्वारा निर्दिष्ट एक और केवल एक तर्क (का एक उदाहरण होना आवश्यक है NSNotification)।
रुडोल्फ एडमकोविच

नोट के लिए @RudolfAdamkovic धन्यवाद - मैंने अपना उत्तर तदनुसार संपादित किया है।
एक्सएक्सएक्स

8

हाँ। खिलाड़ी की स्थिति या दर में एक KVO पर्यवेक्षक जोड़ें:

- (IBAction)go {
   self.player = .....
   self.player.actionAtItemEnd = AVPlayerActionStop;
   [self.player addObserver:self forKeyPath:@"rate" options:0 context:0]; 
}

- (void)stopped {
    ...
    [self.player removeObserver:self]; //assumes we are the only observer
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == 0) {
        if(player.rate==0.0) //stopped
            [self stopped];
    }
    else
        [super observeVal...];
}

तो मूल रूप से, यह बात है।

डिस्क्लेमर: मैंने लिखा था कि अगर कोड अच्छा था, तो यहां मैंने जांच नहीं की। ALSO मैंने पहले कभी भी AVPlayer का उपयोग नहीं किया है लेकिन यह अधिकार के बारे में होना चाहिए।


कैसे "दर" पर्यवेक्षक को हटाने के लिए?
सौमिल शाह

मुझे एक संपादन में कहा गया था कि मुझे निश्चित रूप से दर का निरीक्षण करने की आवश्यकता है। रूपांतरित
डेयज-डीजे

4
इस दृष्टिकोण के साथ एक समस्या यह है कि यह संगीत का अंत है। ठहराव पर दर शून्य है क्योंकि यह अंत में होगा।
C6Silver

5

स्विफ्ट 3 - मैं AVPlayerItemहर बार जब खिलाड़ी के लिए वीडियो जोड़ता हूं तो एक पर्यवेक्षक जोड़ता हूं:

func playVideo(url: URL) {
  let playerItem = AVPlayerItem(asset: AVURLAsset(url: someVideoUrl))
  NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
  self.player.replaceCurrentItem(with: playerItem)
  self.player.play()
}

func playerItemDidPlayToEndTime() {
  // load next video or something
}

1

Apple डॉक्स AVFoundation प्रोग्रामिंग गाइड (निगरानी प्लेबैक अनुभाग के लिए देखो) में बहुत सारी जानकारी है । यह मुख्य रूप से KVO के माध्यम से प्रतीत होता है, ताकि आप उस पर ब्रश करना चाहें, यदि आप बहुत परिचित नहीं हैं (तो इसके लिए एक गाइड है जो कुंजी मान अवलोकन प्रोग्रामिंग के लिए है


4
धन्यवाद, पहले मुझे यह केवीओ के माध्यम से समय की निगरानी के द्वारा काम कर रहा था, लेकिन तब मैंने AVPlayerItemDidPlayToEndTimeNotification लागू किया क्योंकि यह क्लीनर और कम प्रोसेसर-गहन है।
टायलर

1
NSNotificationCenter, KVO और ब्लॉक-आधारित का एक पागल मिश्रण का एक सा। अपने मन को बनाइए Apple!
15

1

मैं इस एक का उपयोग कर रहा हूं, और यह काम करता है:

_player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:_playingAudio.url]];
CMTime endTime = CMTimeMakeWithSeconds(_playingAudio.duration, 1);
timeObserver = [_player addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:endTime]] queue:NULL usingBlock:^(void) {
    [_player removeTimeObserver:timeObserver];
    timeObserver = nil;
    //TODO play next sound
}];
[self play];

जहां _playingAudioकुछ गुणों के साथ अपने कस्टम वर्ग है और timeObserverहै idइवर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.