MPMusicPlayerController не запоминает позицию воспроизведения

Я делаю приложение, которое будет воспроизводить аудиокниги, синхронизированные с iTunes. Есть ли способ, которым мой плеер может запомнить позицию воспроизведения? Или мне нужно реализовать это самостоятельно с какой-то базой данных?

Я тестирую на iOS 8.4


person Hackmodford    schedule 11.07.2015    source источник
comment
Почему у этого вопроса так много голосов? Никаких усилий не показывает...   -  person JAL    schedule 24.07.2015
comment
Это хороший вопрос ;)   -  person Hackmodford    schedule 24.07.2015


Ответы (2)


Ключевым моментом является установка текущего времени воспроизведения на время закладки mpmediaitem перед воспроизведением.

Вот пример:

[self.player setQueueWithItemCollection:self.collection];
self.player.currentPlaybackTime = [self.collection.items[0] bookmarkTime]; 
[self.player play];
person Hackmodford    schedule 24.07.2015

Файл аудиокниги автоматически запоминает позицию воспроизведения и, когда его попросят воспроизвести позже, возобновится с этой позиции — это встроенная функция приложения «Музыка» (теперь iBooks) и, следовательно, MPMusicPlayerController.

Однако вы заметите, что приложение «Музыка» может потерять трек воспроизводимого в данный момент элемента (если пользователь перезапустит устройство). И, конечно же, пользователь может изменить текущий воспроизводимый элемент вручную.

Таким образом, если вы хотите, чтобы ваше приложение вернулось к тому, что оно воспроизводило ранее, вам придется самостоятельно сохранить информацию об этом воспроизводимом элементе. И поэтому вы также можете сохранить текущую позицию воспроизведения, что сделает вас еще более надежным, чем приложение «Музыка».

person matt    schedule 11.07.2015
comment
Я использую [MPMusicPlayerController applicationMusicPlayer], но когда я проигрываю аудиокнигу, она всегда начинается с начала. - person Hackmodford; 11.07.2015
comment
Мой ответ в таком случае еще более правильный - вам определенно нужно следить за этим самостоятельно. - person matt; 12.07.2015
comment
Интересно, как такое приложение, как ecoute, справляется с этим. Он воспроизводит файлы аудиокниг, а приложение iBooks запоминает положение. :/ - person Hackmodford; 12.07.2015
comment
Вот почему я предположил (первое предложение моего ответа), что это особенность самого файла. Когда я загружаю файлы аудиокниг через iTunes на свой iPhone, я проверяю, установлен ли флажок «Запомнить положение» для этих файлов. - person matt; 12.07.2015
comment
Однако я должен признать, что весь мой опыт в этом отношении относится к [MPMusicPlayerController systemMusicPlayer], а не applicationMusicPlayer. Это то, что использует мое приложение. Таким образом, он получает такое же взаимодействие с iBooks. - person matt; 12.07.2015
comment
У меня все еще проблемы. Создаю системный MusicPlayer... Начинаю проигрывать выбранный файл. Это всегда начинается сначала. - person Hackmodford; 12.07.2015
comment
Это случайно не iOS 8.4? - person matt; 12.07.2015
comment
Да. И это одна из причин, по которой я делаю приложение. - person Hackmodford; 12.07.2015
comment
Я спрашиваю, потому что 8.4 с его полностью измененным приложением «Музыка» сломало мое приложение. - person matt; 12.07.2015
comment
Это моя вина, что у меня были проблемы. Я дал тебе +50 репутации ;) - person Hackmodford; 23.07.2015
comment
Это очень специфично для моего приложения. Достаточно сказать, что я искал все случаи, когда я устанавливал curentPlaybackTime, и нашел тот, где он устанавливал его на ноль после загрузки представления;) - person Hackmodford; 23.07.2015
comment
Теперь я запутался, вдруг он снова не играет в правильной позиции. Я прокомментировал каждую строку, которая меняет currentPlaybackTime :( - person Hackmodford; 23.07.2015
comment
Вот почему я предположил, что это может быть проблема iOS 8.4. Что я обнаружил (и другие тоже сообщили об этом), так это то, что воспроизводимый в данный момент элемент / позиция неправильно сообщается для аудиокниг. - person matt; 23.07.2015
comment
Думаю, я действительно был неправ. Он никогда не запоминал положение :( Странно, потому что приложение Ecoute может запоминать положение, даже если я меняю его с помощью iBooks. Интересно, это потому, что они используют более старый SDK? - person Hackmodford; 23.07.2015
comment
Давайте продолжим обсуждение в чате. - person Hackmodford; 23.07.2015
comment
Это странно, потому что приложение Ecoute может запоминать позицию, даже если я меняю ее с помощью iBooks. Но именно поэтому я сказал, что вам нужно играть внутренне и запоминать позицию внутренне. Таким образом, вам все равно, заботится, что делает iBooks. Другими словами, вы используете ApplicationMusicPlayer и не пытаетесь пытаться взаимодействовать с приложением «Музыка» / iBooks — потому что в iOS 8.4, я думаю, вы потерпите неудачу. - person matt; 23.07.2015
comment
Я понял. Ключ в том, чтобы получить время закладки mpmediaitem до того, как вы начнете его воспроизводить. [self.player setQueueWithItemCollection:self.collection]; self.player.currentPlaybackTime = [self.collection.items[0] bookmarkTime]; [самоигрок играет]; Можете ли вы добавить это к своему ответу? - person Hackmodford; 24.07.2015
comment
Я не знал о времени закладки. Вы можете получить его либо как bookmarkTime, либо через valueForProperty с MPMediaItemPropertyBookmarkTime. Тем не менее, это не устраняет ошибку, о которой я говорю, заключающуюся в том, что MPMusicPlayerController не может правильно сообщить о своих собственных nowPlayingItem и currentPlaybackTime. - person matt; 24.07.2015
comment
Это решает мою проблему и чрезвычайно актуально для исходного вопроса;) Не могли бы вы добавить это к своему ответу? - person Hackmodford; 24.07.2015
comment
Я рад, но я не хочу брать на себя ответственность за то, чего я не знал. Вы можете ответить на свой вопрос - и вы можете принять свой ответ вместо того, чтобы принять мой! Если вы это сделаете, я также проголосую за ваш ответ (чтобы поаплодировать вам за то, что вы решили его самостоятельно). Как это звучит? - person matt; 24.07.2015
comment
Хорошо, я все равно хотел предложить это вам. - person Hackmodford; 24.07.2015
comment
Это здорово, но ты уже дал мне награду по доброте душевной. Теперь я хочу позаботиться о том, чтобы вы восстановили всю эту репутацию! :) - person matt; 24.07.2015