Ответ 1
Ну, на самом деле установка скорости до 0 и сброс времени до его фактического значения, когда я приостанавливаю и играю, сделал трюк.
В настоящее время я пытаюсь выяснить, как указать прошедшее время в 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 и его функции времени?
Ну, на самом деле установка скорости до 0 и сброс времени до его фактического значения, когда я приостанавливаю и играю, сделал трюк.
Ну, я поставил селектор для уведомления 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;
}
Удачи!
У меня была эта проблема и она была решена путем обновления прошедшего времени каждый раз, когда вы играете трек. Поэтому ваша кнопка "играть" должна обновлять информацию
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];}