web-dev-qa-db-ja.com

MPNowPlayingInfoCenterが再生を一時停止すると正しく反応しない

再生を一時停止するときにMPNowPlayingInfoCenterを適切に動作させようとしています。 (再生にAVPlayerを使用するストリーミング音楽アプリがあり、Apple TV over Airplayで再生しています。)一時停止以外のすべてがApple TV UI。私はそれを次のように初期化しています:

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

私が理解できないことの1つは、Apple TVで再生ヘッドを一時停止する方法です。ユーザーがUIで一時停止をタップすると、次のようなことを試みます:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];        
[playingInfo setObject:[NSNumber numberWithFloat:0.0f] forKey:MPNowPlayingInfoPropertyPlaybackRate];            
center.nowPlayingInfo = playingInfo;

一時停止する代わりに、これは再生ヘッドをゼロに戻し、それを前進させ続けます。

Apple TV UIで再生ヘッドを正しく一時停止するにはどうすればよいですか?

45
Jaanus

私が解決しました! 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;
15
Damien Romito

ここであなたが何を検索しているか、これは非常にうまく機能しており、これをクラスに追加します:

- (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が必要です

これがあなたを助けることを願っています

3
BlackSheep