VesselWheel

xcode에서 동영상 재생 구현하기(feat. AVKit in CodeBase) 본문

Xcode Study

xcode에서 동영상 재생 구현하기(feat. AVKit in CodeBase)

JasonYang 2024. 1. 25. 20:36

https://developer.apple.com/documentation/avkit

 

AVKit | Apple Developer Documentation

Create user interfaces for media playback, complete with transport controls, chapter navigation, picture-in-picture support, and display of subtitles and closed captions.

developer.apple.com

코드로 구현한 버튼

 

AVKit으로 구현한 동영상

AudioVisual(AV)이란?

슬라이드 테이프 프레젠테이션, 영화, 텔레비전 프로그램, 회사 회의, 교회 예배 등 소리와 시각적 요소를 모두 처리하는 전자 매체를 의미

더보기

AVFoundation

AudioVisual(AV) 리소스 처리하고, 카메라를 제어하며, 오디오를 처리하고, 시스템 오디오와의 상호 작호작용을 할 수 있게 해주는 프레임워크

 

AVKit

플레이어의 콘텐츠를 표시하고 재생을 제어하기 위한 기본적인 사용자 인터페이스(자막, PIP 등)를 제공합니다. (상단 그림 참고)

iOS에서는 기본적으로, AVPlayerViewController 를 통해 제공하며, 

재생 UI를 Custom하고 싶다면, 아래에 소개되는 Core한 개념들을 활용하여 AVKit의 역할을 대체할 수 있는, 커스텀한 사용자 인터페이스를 구현할 수 있다.

AVAsset

AVFoundation에서 AV리소스가 표현되는 객체 3가지의 Track(영상, 소리, 자막)으로 구성되어 있으며, 리소스의 URL을 통해 AVAsset을 생성할 수 있습니다.

리소스와 관련한 정적 정보 (총 재생 시간, 생성 날짜 등)을 가지고 있다.

AVKit을 활용해서 동영상 재생, 정지, 앞으로, 뒤로, 전체화면, PiP 등을 구현할 수 있다. 

 

AVKit을 활용한 동영상 재생 구현 코드 

import UIKit
import AVKit

class ViewController: UIViewController {
    let url = URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")!
    
    // AVPlayerController 생성
    let playerController = AVPlayerViewController()
    
    // AVPlayer 생성
    let player: AVPlayer
    let playButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Play Video", for: .normal)
        button.addTarget(self, action: #selector(playButtonTapped), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()
    
    //초기화
    override init(nibName nibNameOrNil: String?, bundle nilnBundleOrNil: Bundle?) {
        //AVPlayer 초기화
        player = AVPlayer(url: url)
        super.init(nibName: nibNameOrNil, bundle: nilnBundleOrNil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemeted")
    }
    
    //뷰 로드 시
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        // UIButton playButton을 뷰에 츄가
        view.backgroundColor = .white
        view.addSubview(playButton)
        
        // UIButton playButton을 가운데 정렬
        NSLayoutConstraint.activate([
            playButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            playButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }

    // // UIButton playButton이 눌렸을 때 호출되는 함수
    @objc func playButtonTapped() {
        //AV player 할당
        playerController.player = player
        
        //playerController를 노출
        present(playerController, animated: true){
            self.player.play() // present 되면 비디오 재생
        }
    }
}