没有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
是我的自定义类与一些属性和timeObserver
是id
伊娃。
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 }