Sự cố phát lại video chỉ có trên iOS 13 với AVPlayerViewControll và AVPlayer khi sử dụng video HLS


8

Tôi có một ứng dụng phát lại video. Nó tương thích với iOS 11, 12 và iOS 13. Trên iOS 11 và 12, phát lại video hoạt động đúng như mong đợi bằng cách sử dụng AVPlayerViewControllerhoặc thậm chí chỉ AVPlayerLayer.

Tuy nhiên, trên iOS 13, tôi bắt đầu nhận được báo cáo rằng đột nhiên video không tải (hoặc sẽ chỉ tải âm thanh hoặc chỉ khung đầu tiên) cho khá nhiều người dùng khi họ cập nhật iOS. Tôi đã rất khó khăn để sao chép nó, nhưng một số đề cập đến nó xảy ra chủ yếu với các kết nối mạng kém, và chắc chắn với Bộ điều hòa liên kết mạng tôi có thể sao chép nó.

Nó đặc biệt ảnh hưởng đến video HLS (ví dụ như video livestream ưa thích mà Reddit sử dụng). Nó tiếp tục hoạt động tốt với MP4. Đây là một URL ví dụ không thành công: https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8

Đây là hồ sơ điều hòa liên kết mạng kích hoạt nó: https://i.imgur.com/XWsKUeM.jpg

Đây là một dự án mẫu kích hoạt nó, hiển thị cả AVPlayerViewControll và AVPlayer (nhấn Tải xuống, Google thật kỳ lạ): https://drive.google.com/file/d/1RS5DvUypdOLFCYJe1Pt2Ig0fQljZDLs2/view

Đây là mã mẫu hiển thị nó với AVPlayerViewControll:

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()
}

Nếu tôi thử chính xác mã đó trên thiết bị iOS 12 thì nó hoạt động hoàn hảo.

Có ai có bất cứ đề nghị về cách khắc phục nó? Nếu đôi khi bạn chà lại từ đầu bạn có thể khiến video phát lại đúng cách, nhưng không đủ đáng tin cậy để dường như xây dựng một giải pháp từ đó. Công cụ video chắc chắn không phải là sở trường của tôi trong phát triển iOS vì vậy tôi bắt đầu gãi đầu một chút, bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Lưu ý: Tôi khá biết đây là (rất có thể) một lỗi iOS và tôi sẽ gửi Radar, nhưng tôi vẫn phải xử lý ngay.


Bất kỳ cập nhật tiến độ ???
Đồi Reimond

chúng tôi cũng đang đối mặt với vấn đề tương tự. bất kì giải pháp nào?
Moaz Saeed

Câu trả lời:


0

Bạn cần phải kvo trên trạng thái playerItems để biết khi nào nó sẵn sàng để chơi. Sau đó, trong trạng thái playerItem thay đổi để sẵn sàng chơi hãy gọi player.play của bạn.

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.
        }
    }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.