2011-07-26 15 views
76

Etrafa baktım ama AVPlayer class için temsilci protokolü bulamıyorum. Ne verir?AVPlayer Yetkisi Yok mu? Şarkı bittiğinde nasıl izlenir? Objektif C iPhone geliştirme

Her biri bir URL'den yüklenen AVPlayerItems dizisini oynatmak için alt sınıfını (AVQueuePlayer) kullanıyorum. Bir şarkı çalınırken bir yöntemi çağırabileceğim herhangi bir yol var mı? Özellikle kuyruğun sonunda mı?

Ve eğer bu mümkün değilse, arabelleğe alındıktan sonra STARTS adlı şarkı çalındığında bir yöntemi çağırmanın herhangi bir yolu var mı? Orada bir yükleme simgesi almaya çalışıyorum ama [audioPlayer play] eyleminden sonra bile, müzik gerçekten başlamadan önce simgeyi kapatır.

cevap

1

Apple docs AVFoundation Programming Guide'da çok fazla bilgi var (izleme yürütme bölümünü arayın). Size Key Value Observing ProgrammingGuide için bunun için bir rehber var (çok tanıdık değilse o tazelemek isteyebilirsiniz böylece Kvo aracılığıyla ağırlıklı olarak görünmektedir

+4

sayesinde ilk ben Kvo aracılığıyla zamanı izleyerek çalışma var ama sonra AVPlayerItemDidPlayToEndTimeNotification uygulanan Daha temiz ve daha az işlemci yoğun olduğu için. – Tyler

+0

Biraz NSNotificationCenter, KVO ve blok tabanlı bir çılgın karışımı var. Aklını Apple yap! – CupawnTae

7

Evet oyuncunun statüsü veya orana bir KVO gözlemci ekleyin:..

- (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...]; 
} 

Yani temelde, bu kadar

Yasal Uyarı:. Ben kod iyiydi eğer burada bu yüzden kontrol etmedi yazdı AYRICA önce AVPlayer hiç kullanılmamış ama doğru hakkında olmalıdır

..
+0

@downvoter: Lütfen bir yorum bırakın –

+0

@ "rate" observer nasıl kaldırılır? –

+0

Bir düzenlemede, kesin olarak gözlemlemem gereken bir düzenlemede söylendi. uyarlanmış –

141

Evet, AVPlayer sınıfında bir AVAudioPlayer gibi delege protokolü. AVPlayerItem üzerinde bildirimlere abone olmanız gerekir. AVPlayer'da, aksi takdirde -initWithURL:'a aktardığınız URL'yi kullanarak bir AVPlayerItem oluşturabilirsiniz.

-(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 
} 
+0

Bu iyi, ancak duraklama işlemez. –

+1

'itemDidFinishPlaying:' kullandığınızdan emin olun, ör. kolon ile. 'NSNotificationCenter' dokümantasyonundan: _Saydetici tarafından belirtilen yöntemin bir ve tek argümanı olmalıdır (bir "NSNotification" örneği). –

+0

@RudolfAdamkovic Not için teşekkürler - Cevabımı buna göre düzenledim. – arexx

1

ben bunu kullanıyorum ve çalışıyor:

_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 benim özel sınıf bazı özelliklere sahip olduğunu

ve timeObserverid ivar olduğunu.

1

Swift 3 - Ben AVPlayerItem I oyuncuya bir video eklemek her zaman bir gözlemci ekleyin:

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

Çok teşekkürler efendim. Cevap benim için hile yaptı :-) –