4
AVPlayerItem *currentItem = self.player.currentItem;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:currentItem];

上記の通知設定があります。iOS 7 でテストを実行すると素晴らしい方法で呼び出されますが、iOS 8 でアプリケーションを実行すると呼び出されることはありません。

4

2 に答える 2

3

賛成の答えは不正確です。これは私がしなければならなかったことです:

if ([keyPath isEqualToString:@"rate"]) {

    if (_player.rate == 0.0) {
        CMTime time = _player.currentTime;
        NSTimeInterval timeSeconds = CMTimeGetSeconds(time);
        CMTime duration = _player.currentItem.asset.duration;
        NSTimeInterval durationSeconds = CMTimeGetSeconds(duration);
        if (timeSeconds >= durationSeconds - 1.0) { // 1 sec epsilon for comparison
            [_delegate playerDidReachEnd:_player];
        }
    }
}

参考までに、リモート URL のオーディオ ファイルを読み込んでいますが、これが許容範囲に影響するかどうかはわかりません。

于 2015-03-26T12:04:25.550 に答える
3

これは、rate キーパスにオブザーバーを登録することで解決されます。

[self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if (self.player.rate == 0.0) {
    CMTime time = self.player.currentTime;
    if (time >= duration) {
        //song reached end
    }
}
于 2014-12-30T14:15:01.357 に答える