AVPlayerItem не воспроизводит видео, даже если его статус `readyToPlay`, а `isPlaybackLikelyToKeepUp` имеет значение true

Я играю в прямом эфире с AVPlayer и AVPlayerItem. Я наблюдаю за status, isPlaybackLikelyToKeepUp и AVPlayerItemPlaybackStalled AVPlayerItem. Я также наблюдаю за rate AVPlayer.

Пока я тестировал, я обнаружил, что произошла действительно странная вещь.

Пока AVPlayer воспроизводит видео нормально (AVPlayerItem.status == readyToPlay и AVPlayerItem.isPlaybackLikelyToKeepUp == true), если я нажимаю кнопку «Домой», AVPlayer.rate становится 0.0. Это означает, что игрок перестал играть.

Когда приложение возвращается на передний план, и я нажимаю кнопку воспроизведения, оно все еще AVPlayerItem.status == readyToPlay и AVPlayerItem.isPlaybackLikelyToKeepUp == true, но приостановлено и через некоторое время начинает воспроизводиться.

Я хочу знать, что игрок приостановлен или играет. В этом случае, даже если плеер не воспроизводит видео, статус показывает, что оно воспроизводится. (AVPlayerItem.status == readyToPlay, AVPlayerItem.isPlaybackLikelyToKeepUp == true, AVPlayer.rate == 1.0)

Я проверил, что loadedTimeRanges и item.loadedTimeRanges.first AVPlayerItem не равны нулю (loadedTimeRanges имеет только один элемент), а его start и duration не равны 0.

Что я должен проверить?

Я добавляю еще немного.

Этот симптом возникает только при потоковой передаче (m3u8), а не при воспроизведении видео (mp4).

Так что я предполагаю, что это проблема буферизованных данных. Пока проигрыватель играет, в буфере есть данные для воспроизведения, и данные все еще действительны. После того, как приложение переходит в фоновый режим и возвращается на передний план, в буфере игрока все еще есть данные, поэтому isPlaybackLikelyToKeepUp == true, AVPlayerItem.status == readyToPlay. Однако, когда я пытаюсь играть, AVPlayer сбрасывает буфер, потому что он старый.

Похоже, что пока единственный способ — создать новый AVPlayerItem и установить, когда приложение вернется на передний план.

С какой именно проблемой я сталкиваюсь и хочу знать, как ее избежать.

Это репо, над которым я работаю.

https://github.com/trick14/SLPlayer

Верхний — живой, а нижний — VOD. После того, как загрузка завершена, играйте и переключайтесь на фоновый и передний план пару раз. И если вы пытаетесь играть, все статусы выглядят нормально, но проигрыватель зависает.


person Ryan    schedule 31.10.2016    source источник
comment
Какого характера не лайкнуть видео (какие-то ошибки или предупреждения в консоли)? В каком формате файл видео? Это локально (то же устройство) или удаленно?   -  person Andre M    schedule 01.11.2016
comment
@AndreM нет ошибок/предупреждений в консоли. Я тестировал m8u и mp4 на удаленном сервере.   -  person Ryan    schedule 01.11.2016
comment
не могли бы вы предоставить короткий фрагмент кода? Это симулятор или настоящее устройство, и если да, то какое?   -  person Andre M    schedule 01.11.2016
comment
Я тестировал с помощью симулятора (iOS10/iPhone5s) и устройства (iOS10.1.1/iPhone6s+).   -  person Ryan    schedule 01.11.2016
comment
Можете ли вы показать какой-нибудь код или ссылку на проект, который воспроизводит проблему?   -  person Rhythmic Fistman    schedule 03.11.2016
comment
оба, кажется, работают, если вы дадите им время для буферизации   -  person Rhythmic Fistman    schedule 04.11.2016
comment
@RhythmicFistman Я не говорю, что это не работает. Я хочу знать, как определить статус загрузки, даже если AVPlayerItem.status готов к игре, а isPlaybackLikelyToKeepUp имеет значение true.   -  person Ryan    schedule 04.11.2016
comment
Я мог бы воспроизвести проблему, но у меня нет ответа для вас.   -  person shallowThought    schedule 08.11.2016


Ответы (1)


У меня уже давно есть подобный опыт. В то время я сохранил статус воспроизведения и место воспроизведения, когда пользователь нажимает кнопку «Домой». При возвращении на передний план я использовал сохраненную информацию для восстановления или воспроизведения локации.

Я надеюсь, что вы были полезны.

person hooni    schedule 27.02.2017