低速回線(3G)でAVPlayer使って動画を再生中にAVPlayerItemの「presentationSize」が変わる
【事象】
低速回線(3G)でAVPlayer使って動画を再生するとAVPlayerItemの「presentationSize」が変わる。一瞬期待通りのサイズで動画が再生されるが、すぐに潰れた状態になる。
4G回線やWifi接続中は発生しません。
当事象の発生前後の「presentationSize」の値です。
発生前:playerItem.presentationSize: (width = 432, height = 768)
発生後:playerItem.presentationSize: (width = 1280, height = 720)
【ソースコード】
// 事象発生時のコード
func setMovie(url:URL) {
let asset = AVURLAsset(url: url)
playerItem = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: playerItem)
playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
playerLayer.frame = videoBaseView.frame
videoBaseView.layer.addSublayer(playerLayer)
NotificationCenter.default.addObserver(self,
selector: #selector(didPlayToEndTime),
name: .AVPlayerItemDidPlayToEndTime, object: playerItem)
player.play()
}
プロジェクトのコードそのまま載せることができないので関係なさそうな部分は省略してあります。
情報に不足があれば教えてください。
【試したこと】
低速回線の場合のみ発生するため、URLから動画を取得できていないまま再生しているのではないかと考え、動画の取得状況をKVOで監視し、完了してから再生するように変更しました。
// KVO追加のコード
func setMovie(url:URL) {
let asset = AVURLAsset(url: url)
playerItem = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: playerItem)
// AVPlayerItemに対してKVOをセット
playerItem.addObserver(self, forKeyPath: ”status”, options: [.new, .initial], context: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(didPlayToEndTime),
name: .AVPlayerItemDidPlayToEndTime, object: playerItem)
player.play()
}
// KVO
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
guard let keyPath = keyPath else {
return
}
if keyPath == ”status” {
let status = playerItem.status
switch status {
case .unknown:
return
case .readyToPlay:
do {
playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
playerLayer.frame = videoContentView.frame
videoBaseView.layer.addSublayer(playerLayer)
player.play()
}
case .failed:
return
}
}
}
上記のコードで想定した通りステータスが完了の時のみ動画を再生させることができましたが、事象は解消しませんでした。動画が取得できているかどうかは関係ないのでしょうか。
解決策やご助言いただけると助かります。
よろしくお願いいたします。