MPNowPlayingInfoCenter не реагирует должным образом при приостановке воспроизведения
Я пытаюсь заставить MPNowPlayingInfoCenter работать правильно при приостановке воспроизведения. (У меня есть приложение для потоковой музыки, которое использует AVPlayer для воспроизведения, и я играю в своем Apple TV над Airplay.) Все, кроме паузы, похоже, правильно отражено в пользовательском интерфейсе Apple TV. Я инициализирую его следующим образом:
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
MPMediaItemPropertyTitle: title,
MPMediaItemPropertyArtist: artist
};
center.nowPlayingInfo = songInfo;
Так как я потоковый, у меня нет информации о длительности после начала воспроизведения. Когда я получаю сигнал "ready" из потока, я обновляю продолжительность, которая отображается правильно на моем Apple TV:
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
[playingInfo setObject:[NSNumber numberWithFloat:length] forKey:MPMediaItemPropertyPlaybackDuration];
center.nowPlayingInfo = playingInfo;
Я также могу искать эту технику, когда пользователь ищет дорожку:
[playingInfo setObject:[NSNumber numberWithFloat:length * targetProgress] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
Единственное, что я не могу понять, - как приостановить воспроизведение на моем Apple TV. Когда пользователь делает паузу в моем пользовательском интерфейсе, я пытаюсь сделать что-то вроде:
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
[playingInfo setObject:[NSNumber numberWithFloat:0.0f] forKey:MPNowPlayingInfoPropertyPlaybackRate];
center.nowPlayingInfo = playingInfo;
Вместо того, чтобы приостанавливать работу, это обращается к ноте и возвращается вперед.
Как заставить playhead правильно делать паузу в моем Apple TV UI?
Ответы
Ответ 1
У меня есть решение! Установите только MPMediaItemPropertyPlaybackDuration
1 - Когда вы запустите дорожку, установите свойство с общей продолжительностью дорожки:
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
MPMediaItemPropertyTitle: title,
MPMediaItemPropertyArtist: artist
MPMediaItemPropertyPlaybackDuration : [NSNumber numberWithFloat:length]
};
center.nowPlayingInfo = songInfo;
2 - при паузе трека... ничего не делайте.
3 - при воспроизведении дорожки установите свойство с помощью currentTrackTime:
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
[playingInfo setObject:[NSNumber numberWithFloat:player.currentTrackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
center.nowPlayingInfo = playingInfo;
Ответ 2
Здесь, что вы ищете, эта работа очень хороша, добавьте это в свой класс:
- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
if (receivedEvent.type == UIEventTypeRemoteControl) {
switch (receivedEvent.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:[self playPause:nil];
break;
default: break;
}
}
}
вы можете добавлять функции вперед или назад с добавлением другого кода CASE следующим образом:
case UIEventSubtypeRemoteControlBeginSeekingBackward:[self yourBackward:nil];
break;
и для вызова паузы воспроизведения вам необходимо создать такое действие:
- (IBAction)playPause:(id)sender {
if (yourPlayer.rate == 1.0){
[yourPlayer pause];
} else if (yourPlayer.rate == 0.0) {
[yourPlayer play];
}
}
Важно: в любом случае вам нужно добавить IBAction
Надеюсь, что эта помощь вам поможет.
Ответ 3
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
MPMediaItemPropertyTitle: title,
MPMediaItemPropertyArtist: artist
};
вызов типа
center setnowPlayingInfo = songInfo;
Ответ 4
Я попробовал свое предложение из комментариев (около месяца назад), и они работали для меня:
[playingInfo setObject: [NSNumber numberWithFloat:0.000001f]
forKey: MPNowPlayingInfoPropertyPlaybackRate];
(То есть медленно перемещайте playhead verrrrry.) Я периодически добавлял NSTimer
в reset the MPNowPlayingInfoPropertyElapsedPlaybackTime
, пока он приостанавливался.
Для тех, кто ранее не использовал NSTimer
, см. Как использовать NSTimer?.