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
(Тоест преместете главата за възпроизвеждане verrrrry бавно.) Ако работи, можете да използвате 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