iOS: ошибка в AVPlayerItem при получении ответа 304 Not Modified

Это очень странная ошибка.

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

Проблема в том, что если я прокручиваю вперед и назад очень быстро, получая одно и то же видео на экране и за его пределами, запрос, отправленный AVPlayer, в конечном итоге изменяется, чтобы включать HTTP-заголовки If-None-Match и If-Modified-Since, которых нет в остальной части экрана. время. Он систематически заставляет сервер возвращать 304 Not Modified ответ.

Кажется, это не нравится AVPlayer playerItem, который меняет свой статус на AVPlayerItemStatusFailed (что интересно, статус AVPlayer по-прежнему AVPlayerStatusReadyToPlay). Ошибка AVErrorUnknown (-11800) с OSStatus -12983 (который нигде не задокументирован и отсутствует в заголовке всего iOS SDK).

Вот тогда и становится странно: что бы я ни делал дальше, AVPlayer и его playerItem безвозвратно сгорают. Даже если я перенастрою их с другим активом, они просто вернут этот статус и покажут черную рамку. Еще более странно: даже если я инициализирую другой AVPlayer, AVPlayerItem и AVAsset, он больше не будет воспроизводиться, мне придется убить и перезапустить приложение.

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


person P. Unto    schedule 24.03.2015    source источник


Ответы (2)


304 Не изменено

Я столкнулся с ответом 304 Not Modified, который происходит, когда AVPlayer воспроизводит одно и то же видео, и AVPlayerItem.status становится failed, ошибка детали - content range mismatch - should be start 0 length 2 is start 0 length 1048575. Но разница в том, что воспроизведение будет нормальным, если AVPlayer переключиться на воспроизведение другого видео.

Подробный пример HTTP-запроса и ответа:

Часть запроса
If-Modified-Since: сб, 24 июня 2017 г., 03:41:12 GMT
Диапазон: байты = 0–1

Ответная часть
HTTP / 1.1 304 без изменений
Content-Range: байты 0-1048575 / 13852554

Решение:
Измените логику на стороне сервера, измените значение Content-Range на bytes 0-1/13852554 или удалите Content-Range напрямую, после чего воспроизведение начнется нормально.

person Jirui    schedule 27.12.2018

Я встретил ту же проблему. поэтому я добавляю заголовок If-None-Match: ${unique value}, чтобы предотвратить возврат 304. У меня это работает.

    var player = AVQueuePlayer()
    func play(url: String) {
        let headers = ["If-None-Match": "1"]
        let options = ["AVURLAssetHTTPHeaderFieldsKey": headers]
        let asset = AVURLAsset(url: URL(string: url)!, options: options)
        let playItem = AVPlayerItem(asset: asset)
        player.replaceCurrentItem(with: playItem)
        player.automaticallyWaitsToMinimizeStalling = false
        player.playImmediately(atRate: 1)
    }
person ForeverEnjoy    schedule 13.08.2019