更新媒体收集队列MPMediaItemCollection时短暂停止/开始“正在播放"项目 [英] Brief stop/start of Now Playing item when updating a media collection queue MPMediaItemCollection

查看:91
本文介绍了更新媒体收集队列MPMediaItemCollection时短暂停止/开始“正在播放"项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在玩xcode中的apples addMusic示例应用程序,因为我希望能够添加类似的功能(在应用程序的后台播放用户选择的音乐队列).

Im playing about with apples addMusic sample app in xcode, as im looking to be able to add similar functionality (playing a queue of music selected by the user in the background of the app).

当用户在内置MediaPicker中选择了歌曲选择后,当用户单击完成"按钮时,音乐播放器会短暂停止播放,然后再次播放,这会造成令人讨厌的事情. -我假设这是由于apple所使用的方法,该方法将一个新数组应用为队列,并重置当前正在播放的状态(如上所示)

It does this annoying thing where the music player briefly stops before playing again when the user hits the 'Done' button after picking their song selections in the built in MediaPicker. - I'm assuming this is because of the method apple used, which applies a new array as the queue, and resets the now playing state as to where it left off (like so:)

        // apply the new media item collection as a playback queue for the music player
        [self setUserMediaItemCollection: mediaItemCollection];
        [musicPlayer setQueueWithItemCollection: userMediaItemCollection];
        [self setPlayedMusicOnce: YES];
        [musicPlayer play];

        // Obtain the music player's state so it can then be
        //      restored after updating the playback queue.
    } else {

        // Take note of whether or not the music player is playing. If it is
        //      it needs to be started again at the end of this method.
        BOOL wasPlaying = NO;
        if (musicPlayer.playbackState == MPMusicPlaybackStatePlaying) {
            wasPlaying = YES;
        }

        // Save the now-playing item and its current playback time.
        MPMediaItem *nowPlayingItem         = musicPlayer.nowPlayingItem;
        NSTimeInterval currentPlaybackTime  = musicPlayer.currentPlaybackTime;

        // Combine the previously-existing media item collection with the new one
        NSMutableArray *combinedMediaItems  = [[userMediaItemCollection items] mutableCopy];
        NSArray *newMediaItems              = [mediaItemCollection items];
        [combinedMediaItems addObjectsFromArray: newMediaItems];

        [self setUserMediaItemCollection: [MPMediaItemCollection collectionWithItems: (NSArray *) combinedMediaItems]];

        // Apply the new media item collection as a playback queue for the music player.
        [musicPlayer setQueueWithItemCollection: userMediaItemCollection];

        // Restore the now-playing item and its current playback time.
        musicPlayer.nowPlayingItem          = nowPlayingItem;
        musicPlayer.currentPlaybackTime     = currentPlaybackTime;

        // If the music player was playing, get it playing again.
        if (wasPlaying) {
            [musicPlayer play];

        }
    }


}
}

// If the music player was paused, leave it paused. If it was playing, it will continue to
//      play on its own. The music player state is "stopped" only if the previous list of songs
//      had finished or if this is the first time the user has chosen songs after app
//      launch--in which case, invoke play.

- (void) restorePlaybackState {

if (musicPlayer.playbackState == MPMusicPlaybackStateStopped && userMediaItemCollection) {

    if (playedMusicOnce == NO) {

        [self setPlayedMusicOnce: YES];
        [musicPlayer play];
    }
}

}

有人遇到过这个问题吗?有没有其他人可以想到的替代/更有效的方法?

Anyone experienced this issue? Is there any alternative/more efficient methods that anyone can think of?

提前感谢您的分享:)

推荐答案

在Music Player更改通知时,将更改简单地应用于MPMediaItemCollection.

Simply apply the changes to MPMediaItemCollection at the point of Music Player changed notification.

这篇关于更新媒体收集队列MPMediaItemCollection时短暂停止/开始“正在播放"项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆