

### 【事象】

低速回線（3G）でAVPlayer使って動画を再生するとAVPlayerItemの「presentationSize」が変わる。一瞬期待通りのサイズで動画が再生されるが、すぐに潰れた状態になる。  
4G回線やWifi接続中は発生しません。

当事象の発生前後の「presentationSize」の値です。  
**発生前：playerItem.presentationSize: (width = 432, height = 768)**  
**発生後：playerItem.presentationSize: (width = 1280, height = 720)**  
[![画像の説明をここに入力](https://i.stack.imgur.com/XA26U.png)](https://i.stack.imgur.com/XA26U.png)

### 【ソースコード】

[code]

    // 事象発生時のコード
    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()
    }
    
[/code]

プロジェクトのコードそのまま載せることができないので関係なさそうな部分は省略してあります。  
情報に不足があれば教えてください。

### 【試したこと】

低速回線の場合のみ発生するため、URLから動画を取得できていないまま再生しているのではないかと考え、動画の取得状況をKVOで監視し、完了してから再生するように変更しました。

[code]

    // 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
            }
        }
    }
    
[/code]

上記のコードで想定した通りステータスが完了の時のみ動画を再生させることができましたが、事象は解消しませんでした。動画が取得できているかどうかは関係ないのでしょうか。

解決策やご助言いただけると助かります。  
よろしくお願いいたします。


CC BY-SA 4.0
2018-07-27T06:47:50.553
47024
2018-07-27T08:05:12.583
2018-07-27T08:05:12.583
23465
23465
question
swift
低速回線（3G）でAVPlayer使って動画を再生中にAVPlayerItemの「presentationSize」が変わる