Предотвратить захват MPRemoteCommandCenter AVPlayerController

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

Я пытаюсь сделать так, чтобы это приложение могло воспроизводить звук из AVAudioPlayer в фоновом режиме, поэтому я установил параметр в возможностях приложения, и оно работает, но у меня есть некоторые серьезные проблемы.

Первая проблема вызвана установкой

AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default)

который требуется для фонового звука, но также позволяет воспроизводить видео в фоновом режиме, чего я не хочу. Есть ли способ предотвратить это?

Затем я установил элементы управления для экрана блокировки и центра управления с помощью MPRemoteCommandCenter, указав, что аудиопроигрыватель должен запускаться или приостанавливаться, когда пользователь взаимодействует с элементами управления. Если я использую только звук, даже не запуская проигрыватель, и переключаюсь между Центром управления, экраном блокировки и проигрывателем в приложении, все работает нормально.

Но если я запускаю воспроизведение видео с помощью AVPlayerViewController, ставлю его на паузу, запускаю аудиоплеер и перехожу к экрану блокировки, команды подключаются к видео, хотя видео даже не воспроизводится.
Нигде в коде этого нет. бегите за элементами управления, я упоминаю видеоплеер (я также пытался полностью удалить код, но безуспешно).

Это ожидаемое поведение? Есть ли способ отключить это?

TL;DR
У меня есть аудио- и видеоплеер, и я хочу, чтобы только аудиоплеер мог воспроизводиться в фоновом режиме, но по какой-то причине элементы управления из MPRemoteCommandCenter отдают приоритет видеоплееру, и я хотите изменить/отключить это поведение.


person halfblood17    schedule 06.12.2018    source источник


Ответы (1)


Итак, для тех, кто пытается решить это, после небольшого возни я обнаружил, что у AVPlayerController есть свойство updatesNowPlayingInfoCenter, установленное по умолчанию на true.
Установка для него значения false предотвращает большинство проблем, которые у меня были.

Одна проблема, с которой я постоянно сталкивался, заключалась в том, что при воспроизведении аудиофайла, а затем переключении на видео, при закрытии приложения по-прежнему отображались элементы управления проигрывателем с данными, смешанными как из аудио, так и из видео.
Я работал над этим, переключая AVAudioSession.sharedInstance().category с ambient на playback при воспроизведении аудио и обратное переключение на ambient при воспроизведении видео.

person halfblood17    schedule 11.12.2018
comment
Это фактически устранило несвязанную проблему, с которой я столкнулся. Я использую только AVPlayerViewController (без второго проигрывателя), но я привязываю прослушиватель изменения времени к проигрывателю и вручную обновляю MPNowPlayingInfoCenter, чтобы установить название, исполнителя, обложку и другие свойства. Всякий раз, когда я блокировал экран, разблокировал, а затем снова блокировал - элементы управления начинали вести себя беспорядочно. Иногда не появляется, иногда загружается *iTunes* (?!?!), а иногда работает. Я установил этот флажок, и все заработало как по волшебству! - person stevendesu; 23.01.2020