AVPlayer + цикл + фон

Мне нужно:

  • воспроизвести звук
  • петля
  • продолжать играть в фоновом режиме

Все отлично работает с AVAudioPlayer, но теперь я должен использовать AVPlayer для воспроизведения музыкальных композиций из библиотеки iPod. Но есть большая проблема: в AVPlayer нет свойства numberOfLoops, как в AVAudioPlayer.

Хорошо, вы можете зарегистрировать уведомление на NSNotificationCenter для AVPlayerItemDidPlayToEndTimeNotification (или вы также можете использовать метод addBoundaryTimeObserverForTimes с указанным временем, равным продолжительности песни), чтобы получать уведомления, когда песня доиграна до конца. Но это работает только если приложение находится на переднем плане, в фоне песня продолжает играть, но в конце останавливается.

Уведомление также приходит в фоновом режиме (проверено с помощью NSLog), но код селектора:

AVPlayerItem *playerItem = [notification object];  
[playerItem seekToTime:kCMTimeZero];

...не действует, песня не зацикливается.

Какие-либо предложения?


person user370773    schedule 20.06.2011    source источник


Ответы (2)


Проблема, с которой вы столкнулись, заключается в том, что второй раз, когда плеер делает поиск, ваше приложение выглядит так, как будто оно закончило воспроизведение звука, и поэтому оно брошено в костер. :)

Я потратил дни на создание этого обходного пути:

  1. Добавьте «Приложение воспроизводит звук» в «Требуемый фоновый режим» в info.plist.

  2. Создайте еще один AVplayer, который воспроизводит односекундный mp3-файл со скоростью 0,00000001f (silentMp3Player.rate=0,0000001f), который запускается, когда ваше приложение переходит в фоновый режим, и останавливается, когда оно снова выходит на передний план.

person Theis Egeberg    schedule 18.12.2011
comment
Исправление, вы не можете воспроизводить аудиофайлы со скоростью 0,0000001f, даже если AVPlayer поддерживает это. Кажется, что он снижается примерно до 0,001f, поэтому вам понадобится немного более длинный беззвучный mp3 для более длинных пауз. - person Theis Egeberg; 20.01.2012

Попробуйте добавить этот код:

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
person zhangferry    schedule 24.07.2018