Подтвердить что ты не робот

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?

4b9b3361

Ответ 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?.