没有AVPlayer代表? 如何追踪歌曲播放完毕? Objective C iPhone开发

我环顾四周,但我找不到AVPlayer class的委托协议。 是什么赋予了?

我使用它的子类AVQueuePlayer来播放一个AVPlayerItems数组,每个AVPlayerItems都从一个URL加载。 当歌曲结束播放时,有什么办法可以调用方法吗? 值得注意的是在队列的末尾?

如果这是不可能的,有什么办法,当歌曲开始播放,缓冲后,我可以调用一种方法? 我试图在那里得到一个加载图标,但是在音乐实际开始之前,即使它在[audioPlayer play]动作之后,它也会closures图标。

是的,AVPlayer类没有像AVAudioPlayer这样的委托协议。 您需要订阅AVPlayerItem上的通知。 您可以使用在AVPlayer上传递给-initWithURL:的相同URL来创buildAVPlayerItem。

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

是。 将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...]; } 

所以基本上就是这样。

免责声明:我在这里写的,所以我没有检查代码是否好。 此外,我从来没有使用AVPlayer,但它应该是正确的。

Apple文档AVFoundation编程指南中有很多信息(查找监控回放部分)。 这似乎主要是通过KVO,所以如果你不太熟悉的话,你可能希望对此有所了解( 关键值观察编程指南有一个指导。

我正在使用这个,它的工作原理:

 _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是我的自定义类与一些属性和timeObserverid伊娃。

Swift 3 – 我每次向播放器添加一个video时,都会向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 }