Nano Hash - криптовалюты, майнинг, программирование

Проблемы с воспроизведением видео только на iOS 13 с AVPlayerViewController и AVPlayer при использовании видео HLS

У меня есть приложение, которое воспроизводит видео. Он совместим с iOS 11, 12 и iOS 13. В iOS 11 и 12 воспроизведение видео работает должным образом, как и ожидалось, с использованием AVPlayerViewController или даже просто AVPlayerLayer.

Однако в iOS 13 я начал получать сообщения о том, что внезапно видео не загружалось (или загружалось только аудио или только первый кадр) у довольно многих пользователей, когда они обновляли iOS. Мне было очень трудно воспроизвести это, но некоторые упоминали, что это происходило в основном из-за плохого сетевого подключения, и, конечно же, с помощью Network Link Conditioner я смог воспроизвести это.

Это особенно влияет на видео HLS (например, модное совместимое с прямой трансляцией, которое использует Reddit). Он продолжает нормально работать с MP4. Вот пример неудачного URL-адреса: https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8< /а>

Вот профиль Network Link Conditioner, который его запускает: https://i.imgur.com/XWsKUeM.jpg

Вот пример проекта, который запускает его, показывая как AVPlayerViewController, так и AVPlayer (нажмите «Загрузить», Google ведет себя странно): https://drive.google.com/file/d/1RS5DvUypdOLFCYJe1Pt2Ig0fQljZDLs2/view

Вот пример кода, демонстрирующий это с помощью AVPlayerViewController:

let assetURL = URL(string: "https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8")!

// The following MP4 URL *does* work, for instance
// let assetURL = URL(string: "https://giant.gfycat.com/DependentFreshKissingbug.mp4")!

let player = AVPlayer(url: assetURL)
let playerViewController = AVPlayerViewController()
playerViewController.player = player

self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
}

Если я попробую тот же самый код на устройстве с iOS 12, он будет работать отлично.

Есть ли у кого-нибудь предложения о том, как это исправить? Если вы иногда вернетесь к началу, вы сможете заставить видео воспроизводиться правильно, но недостаточно надежно, чтобы, казалось бы, построить на этом решение. Видеоматериал определенно не является моей сильной стороной в разработке iOS, поэтому я начинаю немного чесать голову, любая помощь будет очень признательна.

Примечание. Я прекрасно понимаю, что это (вероятно) ошибка iOS, и я отправлю сообщение Radar, но мне все еще нужно с этим разобраться.


  • Есть обновления прогресса??? 14.02.2020
  • мы также сталкиваемся с той же проблемой. любое решение? 23.02.2020
  • @christianselig - лучше сообщить об ошибке 14.05.2020

Ответы:


1

Вам нужно указать статус playerItems, чтобы узнать, когда он будет готов к игре. Затем в статусе playerItem измените статус на «Готов к игре», вызовите свой player.play.

playerItem.addObserver(self,
                           forKeyPath: #keyPath(AVPlayerItem.status),
                           options: [.old, .new],
                           context: &playerItemContext)


override func observeValue(forKeyPath keyPath: String?,
                           of object: Any?,
                           change: [NSKeyValueChangeKey : Any]?,
                           context: UnsafeMutableRawPointer?) {

    // Only handle observations for the playerItemContext
    guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath,
                           of: object,
                           change: change,
                           context: context)
        return
    }

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItemStatus
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        // Switch over status value
        switch status {
        case .readyToPlay:
            // Player item is ready to play.
        case .failed:
            // Player item failed. See error.
        case .unknown:
            // Player item is not yet ready.
        }
    }
}


16.03.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..