MPNowPlayingInfoCenter не реагирует должным образом при приостановке воспроизведения

Я пытаюсь заставить MPNowPlayingInfoCenter работать правильно при приостановке воспроизведения. (У меня есть потоковое музыкальное приложение, которое использует AVPlayer для воспроизведения, и я воспроизвожу его на своем Apple TV через Airplay.) Все, кроме паузы, кажется, правильно отражается в пользовательском интерфейсе Apple TV. Я инициализирую это так:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
};
center.nowPlayingInfo = songInfo;

Поскольку я транслирую, у меня нет информации о продолжительности при запуске воспроизведения. Когда я получаю «готовый» сигнал из потока, я обновляю продолжительность, которая правильно отображается на моем 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;

Вместо паузы указатель воспроизведения возвращается к нулю и продолжает двигаться вперед.

Как заставить точку воспроизведения правильно приостанавливаться в пользовательском интерфейсе Apple TV?


person Jaanus    schedule 01.08.2012    source источник
comment
Вы пытались просто приостановить свой AVPlayer?   -  person Roman Temchenko    schedule 06.08.2012
comment
@RomanTemchenko да, когда пользователь вызывает элемент управления пользовательским интерфейсом приостановки на устройстве, то в дополнение к экспериментам с информационным центром я делаю [player pause];, где player — экземпляр AVPlayer. Это не влияет на пользовательский интерфейс Apple TV. Звук на самом деле останавливается и возобновляется, как и ожидалось, но в ходе воспроизведения есть проблемы, которые я описываю.   -  person Jaanus    schedule 07.08.2012
comment
Мне никогда не удавалось правильно поставить его на паузу, поэтому вместо этого я установил продолжительность, скорость и позицию на ноль. Это привело к простому удалению индикатора выполнения на время, что было достаточно хорошо для моих целей.   -  person David Morton    schedule 21.09.2012
comment
Скорость воспроизведения 0 не является скоростью. Я не уверен, что это сработает, но вы пробовали что-то вроде [playingInfo setObject:[NSNumber numberWithFloat:0.000001f] forKey:MPNowPlayingInfoPropertyPlaybackRate];?   -  person Aaron Brager    schedule 16.03.2013
comment
(То есть перемещайте точку воспроизведения очень медленно.) Если это сработает, вы можете использовать NSTimer для периодического сброса MPNowPlayingInfoPropertyElapsedPlaybackTime во время паузы.   -  person Aaron Brager    schedule 16.03.2013


Ответы (3)


У меня есть решение! Установите только 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;
person Damien Romito    schedule 11.02.2014
comment
разве это не должно быть MPNowPlayingInfoPropertyElapsedPlaybackTime вместо MPNowPlayingInfoPropertyPlaybackRate?? - person Clement Prem; 03.09.2014
comment
разве это не должно быть player.currentPlaybackTime вместо player.currentTrackTime или я ошибаюсь? - person Pedro Lorente; 25.02.2015
comment
Да, @Pedro, это зависит от названия твоей собственности. - person Damien Romito; 25.02.2015
comment
это решение устанавливает прошедшее время на ноль в проигрывателе экрана блокировки, поэтому вообще не работает - person hamsternik; 04.02.2019

Вот то, что вы ищете, это работает очень хорошо, добавьте это в свой класс:

- (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

Надеюсь, это поможет вам

person BlackSheep    schedule 30.04.2013

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
};

звонок как

center setnowPlayingInfo = songInfo;
person abymathew    schedule 01.10.2013