iOS AVFoundation AVPlayer [AVPlayer] 영상 크기 가져오기

[AVPlayer] 영상 크기 가져오기

iOS 10 부터 지원하는 videoRect property 를 사용해서 play 중인 영상의 frame을 가져올 수 있다.

영상이 재생 중이 아닐때는 .zero frame을 리턴하게 된다. 그래서 영상의 사이즈를 가져오려면 영상의 재생 여부를 옵저빙 후 가져와야 한다.

import AVKit

var playerLayer: AVPlayerLayer?
private func setupAVPlayer() {
  let player = AVPlayer(url: videoURL)
  player.addObserver(self,
                     forKeyPath: "timeControlStatus",
                     options: [.old, .new],
                     context: nil)
  player.isMuted = true // 음소거 여부
  let playerLayer = AVPlayerLayer(player: player)
  view.layer.addSublayer(playerLayer)
  
  self.playerLayer = playerLayer
}

AVPlayer와 AVPlayerLayer 세트의 생성 코드이다. 여기서 “timeControlStatus”를 KVO하여 플레이어의 상태를 옵져빙한다.

override func observeValue(forKeyPath keyPath: String?,
                           of object: Any?,
                           change: [NSKeyValueChangeKey: Any]?,
                           context: UnsafeMutableRawPointer?) {
  guard
    object as AnyObject? === player,
    keyPath == "timeControlStatus",
    player?.timeControlStatus == .playing
  else { return }
  
  print(playerLayer?.videoRect)
}

이후 영상이 플레이가 되면 이벤트가 발생하고 videoRect를 얻어 올 수 있다. 해당 frame으로 영상에 맞는 서브뷰들을 배치할 수 있다!

댓글남기기