Как вы можете воспроизводить музыку из приложения iPod, продолжая получать события пульта дистанционного управления в вашем приложении?
Хорошо, я пытаюсь позволить пользователю выбирать песни из своей библиотеки iPod для прослушивания, но я все еще хочу получать уведомления пульта дистанционного управления (наушники, экран блокировки OSD и т. Д.) В своем приложении, чтобы я мог сделать некоторые дополнительные вещи. До сих пор я могу воспроизводить либо музыку с iPod, либо события в наушниках, но не одновременно.
Вот что я знаю до сих пор...
Если вы используете MPMusicPlayer, вы можете легко получить программный доступ ко всей музыкальной библиотеке. Однако оно, а не ваше приложение, получает удаленные уведомления независимо от того, используете ли вы applicationMusicPlayer или ipodMusicPlayer.
Если вы используете AVAudioPlayer (рекомендованный Apple проигрыватель для большинства звуков в вашем приложении), вы можете легко получать удаленные уведомления, но у него нет собственного доступа к библиотеке iPod.
AVAudioPlayer можно инициализировать с помощью URL-адреса ресурса, а у дорожек в библиотеке iPod (типа MPMediaItem) действительно есть свойство URL-адреса, которое возвращает экземпляр NSURL, который явно указан в документации для использования с объектами AVAsset, но при попытке инициализации AVAudioPlayer с этим NSURL, это не удается. (Я использовал трек "сейчас воспроизводится" в iPod, который был в формате MP3, и он вернул действительный объект NSURL, но инициализация не удалась. Еще хуже, когда это был файл Audible.com, свойство NSURL полностью вернуло ноль.)
Если вы попытаетесь использовать экземпляр AVAudioPlayer для получения удаленных событий (скажем, с пустым звуковым файлом), а затем одновременно использовать класс MPMusicPlayer для воспроизведения музыки на iPod, у вас будет доступ к удаленному управлению, пока вы фактически не начнете воспроизведение iPod, в то время как вы потеряете это так как ваш аудио сеанс деактивируется и системный аудио сеанс становится активным.
Если вы попробуете то же самое, что и #4, но вместо этого установите категорию аудиосеанса в смешиваемый вариант, ваш сеанс не будет деактивирован, но вы все равно потеряете возможность дистанционного управления, как только iPod начнет воспроизводиться.
Короче говоря, всякий раз, когда воспроизводится MPMusicPlayer, я не могу получать удаленные события, и я не знаю другого способа воспроизведения контента из библиотеки iPod, кроме как с помощью MPMusicPlayer.
ЛЮБЫЕ предложения о том, как обойти это, будут приветствоваться. Творческий или сумасшедший. Не волнует, пока это работает.
Кто-нибудь? Кто-нибудь? Bueller? Bueller?
M
4 ответа
ХА! Решено! Я знал, что это возможно! (Спасибо за поддержку http://www.async-games.com/!)
Ниже описано, как воспроизводить музыку с iPod в вашем приложении, с поддержкой фона и с помощью приложения, получающего уведомления от пульта дистанционного управления.
Вы должны использовать AVPlayer (но не AVAudioPlayer. Не знаю, почему это так!), Инициализированный URL-адресом ресурса из MPMediaItem, который вы получили из средства выбора библиотеки (или текущего элемента в MPMusicPlayerController или где-либо еще), а затем установить для категории аудиосеанса значение Playable (НЕ включайте переопределение микширования, иначе вы потеряете удаленные события!) и добавьте соответствующие ключи в ваш файл info.plist, сообщая ОС, что ваше приложение хочет поддерживать фоновое аудио.
Готово и сделано!
Это позволяет воспроизводить элементы из вашей библиотеки iPod (кроме файлов Audible.com по некоторым причинам!) В фоновом режиме и по-прежнему получать удаленные события. Конечно, поскольку это ваш аудиоплеер, который отделен от приложения iPod и будет прерывать его, вам придется проделать больше работы, но это перерывы!
Черт, хотя... Я просто хотел, чтобы это работало с файлами Audible.com. (Для интересующихся причина, по которой это не так, заключается в том, что URL ресурса для слышимого файла возвращает ноль. Воняет! Но что поделаешь!)
Это, вероятно, больше не будет иметь никакого смысла для OP, но, как это может быть для людей, которые находят эту страницу через поиск в Google, я все равно опубликую ее.
Альтернативный (но довольно уродливый) подход, если вас интересуют только события дистанционного управления музыкой и вы все еще хотите воспроизводить файлы audible.com...
Просто продолжайте использовать MPMusicPlayer и отслеживайте его уведомления (теперь игра и состояние изменились). Чтобы получать эти уведомления в фоновом режиме, вы можете использовать "магию фонового потока", описанную в разных местах, чтобы предотвратить приостановку работы вашего приложения. Вы не собираетесь получать пульты дистанционного управления напрямую (так как их получает iPod-плеер), но, отслеживая изменения в режиме "сейчас воспроизводится", вы можете вывести события ControlPreviousTrack и ControlNextTrack, а, отследив воспроизведение State, вы можете вывести TogglePlayPause команда.
Недостатком является то, что ваше приложение будет работать постоянно без уважительной причины (хотя, если честно, если iOS запрограммирована правильно, фоновый поток, который ничего не делает, почти не потребляет батареи).
Другая альтернатива: использовать MPMoviePlayer? Я проверил, что он хорошо работает в фоновом режиме, и должен получать события удаленного управления, а также. Он может воспроизводить MPMediaItem изначально, так что, надеюсь, файлы Audible.com также...
Обойти это невозможно. Если пользовательское приложение iPod воспроизводит выбор iPod, то все удаленные события будут отправляться на iPod, а не на ваше приложение.
Одна мысль, которую я заметил о MPMediaItemPropertyAssetURL, заключается в том, что хотя возвращаемый объект находится в NSURL, но absoluteString выглядит примерно так:
Сделать ставку библиотека://item/item.mp3 ID =580807975475997900
Что не то, что хочет AVAudioPlayer. AVAudioPlayer хочет, чтобы объект NSURL создавался из файла с допустимым путем к файлу.
И я понятия не имею, как получить путь к файлу из MPMediaItem. Поэтому я думаю, что AVPlayer - это то, что нужно, если вы хотите воспроизвести трек iPod без использования MPMusicPlayer.