Вопрос по airplay, avplayer, mpnowplayinginfocenter, ios – MPNowPlayingInfoCenter не реагирует должным образом при приостановке воспроизведения

45

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

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

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

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

Ваш Ответ

3   ответа
15

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;
Да, @Pedro, это зависит от названия вашей собственности
О да! спасибо @Clement
не должно бытьplayer.currentPlaybackTime вместоplayer.currentTrackTime или я не прав?
не должно ли это быть MPNowPlayingInfoPropertyElapsedPlaybackTime вместо MPNowPlayingInfoPropertyPlaybackRate ??
@DamienRomito не работает для меня
3

это работает очень хорошо, добавьте это к вашему классу:

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

и для вызова play pause вам нужно создать такое действие:

- (IBAction)playPause:(id)sender {

    if (yourPlayer.rate == 1.0){

        [yourPlayer pause];
    } else if (yourPlayer.rate == 0.0) {

        [yourPlayer play];
    }
}

Важно: в любом случае при добавлении требуется IBAction

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

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

звонок как

center setnowPlayingInfo = songInfo;

Похожие вопросы