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 AVPlayerViewController
ou 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.
fonte
Respostas:
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.
fonte