Problemas de reprodução de vídeo apenas no iOS 13 com AVPlayerViewController e AVPlayer ao usar vídeo HLS


9

Eu tenho um aplicativo que reproduz vídeos. É compatível com iOS 11, 12 e iOS 13. No iOS 11 e 12, a reprodução de vídeo funciona corretamente conforme o esperado, usando um AVPlayerViewControllerou mesmo apenas AVPlayerLayer.

No entanto, no iOS 13, comecei a receber relatórios de repente o vídeo não estava sendo carregado (ou apenas carregava áudio ou apenas o primeiro quadro) para alguns usuários quando eles atualizavam o iOS. Eu tive muita dificuldade em replicá-lo, mas alguns mencionaram que isso ocorreu principalmente com conexões de rede ruins e, com certeza, com o Network Link Conditioner eu consegui reproduzi-lo.

Isso afeta especificamente o vídeo HLS (o compatível com transmissão ao vivo que o Reddit usa, por exemplo). Ele continua a funcionar bem com o MP4. Aqui está um exemplo de URL que falha: https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8

Aqui está um perfil do Network Link Conditioner que o aciona: https://i.imgur.com/XWsKUeM.jpg

Aqui está um exemplo de projeto que o aciona, mostrando o AVPlayerViewController e o AVPlayer (clique em Download, o Google está sendo estranho): https://drive.google.com/file/d/1RS5DvUypdOLFCYJe1Pt2Ig0fQljZDLs2/view

Aqui está um código de exemplo mostrando-o com o 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()
}

Se eu tentar exatamente o mesmo código em um dispositivo iOS 12, ele funcionará perfeitamente.

Alguém tem alguma sugestão sobre como corrigi-lo? Às vezes, se você voltar ao início, poderá reproduzir o vídeo corretamente, mas não com confiabilidade suficiente para, aparentemente, criar uma solução a partir disso. O material de vídeo definitivamente não é o meu forte no desenvolvimento do iOS, então estou começando a coçar a cabeça um pouco, qualquer ajuda seria super apreciada.

Nota: Estou ciente de que este (provavelmente) é um bug do iOS e vou arquivar um radar, mas ainda tenho que lidar com isso agora.


Alguma atualização de progresso ???
Reimond Hill

também estamos enfrentando o mesmo problema. qualquer solução?
Moaz Saeed

@christianselig - melhor registrar um bug
sia

Respostas:


1

Você precisa kvo no status playerItems para saber quando está pronto para jogar. Em seguida, no status playerItem, mude para pronto para jogar, chame seu 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.
        }
    }
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.