MPMusicPlayerController не будет искать указанное время воспроизведения

Я хочу, чтобы экземпляр MPMusicPlayerController.applicationMusicPlayer() начинал воспроизведение с определенного времени начала:

applicationMusicPlayer.setQueueWithStoreIDs([String(track.id)])
    applicationMusicPlayer.currentPlaybackTime = 10.0
    print(applicationMusicPlayer.currentPlaybackTime) // will print 10.0

Но как только игрок начнет воспроизводить элемент, его currentPlaybackTime обнулится и начнется сначала:

applicationMusicPlayer.play()
print(applicationMusicPlayer.currentPlaybackTime) // will print 0.0

Я подумал, может быть, это потому, что я установил воспроизведение на только что созданный проигрыватель, который еще не готов, но ни .prepareToPlay(), ни .isPreparedToPlay() не помогают мне в этой ситуации.

Я даже пытался подождать несколько секунд и только потом запускать воспроизведение с той позиции, которую выставил. Никакого успеха, крайнее разочарование.

Может быть, это как-то связано с тем, что я проигрываю песни напрямую из Apple Music? Я не могу переключиться на AVPlayer, потому что мне нужно воспроизводить музыку из Apple Music.

Буду признателен за любые мысли и помощь!

ОБНОВЛЕНИЕ: я нашел метод beginSeekingBackward в MPMediaPlayback, и он говорит, что если контент передается в потоковом режиме, он не будет иметь никакого эффекта: https://developer.apple.com/document/mediaplayer/mpmediaplayback/1616248-beginseekingbackward?language=objc Похоже на только встроенное приложение «Музыка» имеет контроль над потоковым воспроизведением музыки?


person Ian    schedule 22.07.2017    source источник
comment
Я не уверен, что это относится к applicationMusicPlayer, но попробуйте определить его там, где он может поддерживать сильную ссылку (так, var myPlayer = ApplicationMusicPlayer() ).   -  person solenoid    schedule 22.07.2017
comment
@solenoid Ну, не то чтобы он выпускается ... Он, безусловно, сохранен и может воспроизводить музыку. Проблема в том, что он не будет воспроизводить трек, начиная с определенного времени через Apple Music.   -  person Ian    schedule 22.07.2017
comment
Вы пробовали использовать systemMusicPlayer()?   -  person solenoid    schedule 22.07.2017
comment
@solenoid Да, точно такое же поведение. Похоже, что AM просто не позволяет воспроизводить потоковое воспроизведение с определенной точки.   -  person Ian    schedule 23.07.2017
comment
@solenoid кстати, посмотрите обновление   -  person Ian    schedule 23.07.2017
comment
Это... кажется, Apple могла бы что-то сделать.   -  person solenoid    schedule 23.07.2017
comment
У меня точно такая же проблема. Пока проигрыватель играет, я могу установить currentPlaybackTime, и проигрыватель возобновится с заданного времени. Однако, когда я приостанавливаю проигрыватель, затем устанавливаю currentPlaybackTime и играю снова, currentPlaybackTime сбрасывается до 0, и проигрыватель продолжает оттуда. Любое решение, @Jan?   -  person helkarli    schedule 24.08.2017
comment
@helkarli Ну, я немного углубился в тему и в какой-то момент нашел информацию от Apple, что возможность изменять само воспроизведение защищена всеми этими соглашениями с артистами и прочим. Итак, насколько я понял, я, артист X, даю Apple Music разрешение на изменение воспроизведения моих песен, но это не распространяется на сторонних разработчиков, таких как вы и я. Я могу сильно ошибаться, но это была самая глубокая причина, которую я мог найти, которая могла бы объяснить, почему Apple ограничила эту функцию.   -  person Ian    schedule 26.08.2017
comment
@helkarli также я не совсем понял, как вам удалось изменить значение воспроизведения, когда оно переходит в заданное время. Вы имеете в виду, что если игрок находится в состоянии воспроизведения, то мы можем явно дать ему метку времени, с которой он будет играть, а когда он не играет, мы не можем? Эта музыка транслируется с AM? Просто небольшое объяснение было бы очень признательно   -  person Ian    schedule 26.08.2017
comment
Привет @Jan! Да, это именно то, что я говорю. let player = MPMusicPlayerController.applicationMusicPlayer() player.setQueueWithStoreIDs(["some store id"]) player.play() player.currentPlaybackTime = 120 debugPrint(player.currentPlaybackTime) //prints 120 и продолжает воспроизведение с этого места. let player = MPMusicPlayerController.applicationMusicPlayer() player.setQueueWithStoreIDs(["some id"]) player.play() player.pause() player.currentPlaybackTime = 120 player.play() debugPrint(player.currentPlaybackTime) //prints 0 and starts the song from the beginning   -  person helkarli    schedule 28.08.2017
comment
@helkarli вы уверены, что транслируете музыку из AM, а не просто воспроизводите ее из библиотеки? Может ли быть так, что именно эта песня, которую вы играете, загружена на iPhone? Потому что я только что проверил ваш метод, и он все еще играет с самого начала :(   -  person Ian    schedule 28.08.2017


Ответы (1)


Я только что столкнулся с этой точной проблемой. Мне удалось обойти это с помощью следующего кода.

Он создает фоновый поток, который постоянно проверяет currentPlaybackTime игрока. Как только currentPlaybackTime не то время, которое я установил, я вернул currentPlaybackTime то, что хотел.

Это похоже на ужасный взлом, но пока это работает для меня.

MPMusicPlayerController *player = [MPMusicPlayerController systemMusicPlayer];
player.currentPlaybackTime = _startTime;
[player play];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
    while(true) {
        if (player.currentPlaybackTime != _startTime) {
            player.currentPlaybackTime = _startTime;
            break;
        }
    }
});
person Daniel Wood    schedule 08.11.2017
comment
Воистину варварство :D Никаких перебоев в воспроизведении не наблюдается? Все звучит гладко? - person Ian; 10.11.2017
comment
@ Ян, я все еще не уверен. На моем устройстве все звучит так, как должно, но тестовые пользователи упомянули, что в музыке есть небольшое дрожание. - person Daniel Wood; 10.11.2017
comment
Я использую этот обходной путь, но мое приложение иногда падает с EXC_BAD_ACCESS, когда оно проверяет player.currentPlaybackTime в условном выражении внутри цикла. Не знаю, что происходит. - person Germán; 10.01.2021