MPNowPlayingInfoCenter - прошедшее время продолжает отсчет, когда аудио приостановлено

В настоящее время я пытаюсь выяснить, как указать прошедшее время в MPNowPlayingInfoCenter, на iOS.

Когда я начинаю играть, я устанавливаю прошедшее время равным 0, а скорость воспроизведения - 1. Это отлично работает.

Затем я приостанавливаю звук. Это правильно обнаружено MPNowPlayingInfoCenter, и оно приостанавливает прошедшее время на интерфейсах.

Только когда я возобновляю игру, все идет не так: время отображается так, как будто оно продолжало играть во время паузы. Пример:

1. Start playback
2. Let it play for 10 seconds
3. Pause for 5 seconds
4. Resume playback

В этот момент фактическое время на дорожке составляет 10 секунд. Тем не менее, информационный центр отображает 15.

Я попытался установить скорость воспроизведения на 0 во время паузы, но это приводит к странному поведению: отображаемое время случайным образом изменяется на меньшее значение.

Кроме того, у меня нет возможности обновить прошедшее время до возобновления песни, так как я получаю возможность сделать это после получения события play.

tl; dr: Как обрабатывать паузы в MPNowPlayingInfoCenter и его функции времени?

Ответ 1

Ну, на самом деле установка скорости до 0 и сброс времени до его фактического значения, когда я приостанавливаю и играю, сделал трюк.

Ответ 2

Ну, я поставил селектор для уведомления MPMoviePlayerPlaybackStateDidChangeNotification. Он называется всякий раз, когда фильм воспроизводится, приостанавливается, слайд вверх/вниз инфоцентр (центр управления). Или даже если фильм транслируется, и он делает паузу/воспроизведение при получении ответа.

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieStateChange)
                                                 name:MPMoviePlayerPlaybackStateDidChangeNotification 

object:nil];

И я делаю

- (void)movieStateChange{
    [self updateControlCenter];
}

И это мой updateControlCenter, он принимает уже начатую информацию о воспроизведении и обновляет ключ MPNowPlayingInfoPropertyElapsedPlaybackTime.

- (void)updateControlCenter{
    NSMutableDictionary *nowPlayingInfo = [center.nowPlayingInfo mutableCopy];
    [nowPlayingInfo setObject:[NSNumber numberWithDouble:self.player.currentPlaybackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
    center.nowPlayingInfo = nowPlayingInfo;
}

Удачи!

Ответ 3

У меня была эта проблема и она была решена путем обновления прошедшего времени каждый раз, когда вы играете трек. Поэтому ваша кнопка "играть" должна обновлять информацию

Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
if (playingInfoCenter) {
    NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
    [songInfo setObject:currentTrack.trackTitle forKey:MPMediaItemPropertyTitle];
    [songInfo setObject:currentTrack.artist forKey:MPMediaItemPropertyArtist];
    [songInfo setObject:currentTrack.albumTitle forKey:MPMediaItemPropertyAlbumTitle];
    [songInfo setObject:currentTrack.trackLength forKey:MPMediaItemPropertyPlaybackDuration];
    [songInfo setObject:currentTime forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];}