🎥 영상 재생을 위하여

Untitled

Untitled

📺 AVPlayerLayer

⏯️ AVPlayer

그래서 AVPlayerLayer를 layer로 두고, AVPlayer를 통한 영상 재생 인터페이스를 제공하는 뷰를 다음과 같이 구성했다. 다만, 영상 재생을 위한 AVPlayer 실제 객체는 외부에서 세팅해주도록 했다.

import UIKit
import AVFoundation

final class PlayerView: UIView {

    // MARK: - Properties

    // Override the property to make AVPlayerLayer the view's backing layer.
    override static var layerClass: AnyClass { AVPlayerLayer.self }

    // The associated player object.
    var player: AVPlayer? {
        get { playerLayer?.player }
        set { playerLayer?.player = newValue }
    }

    private var playerLayer: AVPlayerLayer? { layer as? AVPlayerLayer }

    // MARK: - Initializer

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    // MARK: View Life Cycle

    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer?.frame = bounds
    }

    // MARK: Methods

    func setVideoFillMode(_ mode: AVLayerVideoGravity) {
        playerLayer?.videoGravity = mode
    }

    func play() {
        playerLayer?.player?.play()
    }

    func pause() {
        playerLayer?.player?.pause()
    }

    func seek(to time: CMTime) {
        playerLayer?.player?.seek(to: time)
    }

    func isPlaying() -> Bool {
        return playerLayer?.player?.rate != 0 && playerLayer?.player?.error == nil
    }
}