AVPlayer — 핵심 개념, 기능 및 사용법

저자: IT Sectr 게시일: 2026-05-23 읽는 시간: 9 분

AVPlayer는 Apple의 미디어 플레이어 프레임워크로, AVFoundation의 일부이며 iOS, macOS, tvOS 및 visionOS에서 오디오 및 비디오 재생을 제공합니다. AVPlayer는 로컬 MP4 파일부터 적응형 HLS 스트림까지 Apple Silicon 칩에서 하드웨어 가속 디코딩을 갖춘 통합 API를 통해 광범위한 형식을 지원합니다. Apple WWDC(2024)에 따르면 AVPlayer는 Apple TV, Music 및 Photos를 포함하여 미디어를 다루는 90%의 iOS 애플리케이션에서 사용됩니다.

핵심 요점

  • AVPlayer — 모든 Apple 플랫폼을 위한 AVFoundation의 Apple 미디어 플레이어 프레임워크.
  • 하드웨어 가속 — AVPlayer는 GPU 디코딩을 위해 VideoToolbox를 사용하여 전력 소비를 줄입니다.
  • HLS — 자동 적응형 비트레이트 전환을 지원하는 네이티브 HTTP Live Streaming.
  • Picture in Picture — iPad, iPhone 및 Mac에서 PIP 모드를 위한 내장 지원.
  • DRM — 프리미엄 콘텐츠 보호를 위한 FairPlay Streaming 통합.

AVPlayer란 무엇인가?

AVPlayer는 AVFoundation 프레임워크의 핵심 구성 요소로, 모든 Apple 플랫폼에서 멀티미디어 재생을 담당합니다. iOS 4.0(2010)에서 더 이상 사용되지 않는 MPMoviePlayerController의 대체품으로 도입된 AVPlayer는 디코딩 매개변수의 미세 조정, 오디오-비디오 동기화, AirPlay 및 Picture in Picture와 같은 시스템 서비스와의 통합을 통해 재생에 대한 저수준 제어를 제공합니다.

타사 플레이어와 달리 AVPlayer는 Apple Silicon 칩에서 하드웨어 가속의 이점을 얻습니다. 비디오 디코딩은 전용 M-시리즈 미디어 엔진(Media Engine)을 사용하여 VideoToolbox를 통해 수행되며, 최소 전력 소비로 8K HDR 재생을 가능하게 합니다. HEVC(H.265) 및 ProRes의 경우 디코딩은 CPU에 부담을 주지 않고 전문화된 칩 블록에서 이루어집니다.

AVPlayer는 Apple 생태계와 긴밀하게 통합됩니다: 기기 간 재생 전송을 위한 Handoff 지원, Apple TV로 스트리밍하기 위한 AirPlay 2, 동적 헤드 트래킹이 포함된 공간 오디오, MPNowPlayingInfoCenter를 통한 시스템 제어 요소와의 동기화. 이러한 통합으로 AVPlayer는 Apple 플랫폼에서 미디어를 다루는 모든 애플리케이션의 사실상 표준이 되었습니다.

AVFoundation 및 클래스 계층 구조

AVFoundation 프레임워크는 재생을 위한 3계층 구조를 제공합니다: AVAsset(메타데이터 및 콘텐츠 정보), AVPlayerItem(특정 콘텐츠 인스턴스의 상태 및 관리), AVPlayer(재생 제어). 이 아키텍처는 메타데이터 로딩, 재생 준비 및 재생 프로세스 자체를 분리하며, 이는 여러 비트레이트 옵션이 있는 HLS 스트림에 특히 중요합니다.

AVAsset은 미디어 콘텐츠 모델(파일 또는 스트림)을 나타냅니다. AVAsset 자체는 재생 가능하지 않습니다. 트랙(AVAssetTrack), 메타데이터(commonMetadata), 재생 시간 정보 및 기타 특성을 포함합니다. AVAsset에서 AVPlayerItem이 생성되며, 이를 AVPlayer에 전달하여 재생할 수 있습니다.

AVPlayer의 주요 기능

AVPlayer는 단순한 파일 재생부터 DRM이 포함된 복잡한 라이브 방송까지 대부분의 재생 시나리오를 포괄하는 기능 세트를 제공합니다. 사용 예시와 함께 주요 기능을 살펴보겠습니다.

기능설명플랫폼
로컬 파일MP4, MOV, M4V, AVI, MKV(확장 기능 통해)iOS, macOS, tvOS
HLS적응형 ABR을 통한 HTTP Live Streaming모든 Apple 플랫폼
FairPlay DRM스트리밍 라이선스로 보호된 HLS 콘텐츠iOS, tvOS, macOS
Picture in Picture다른 앱 위에 떠 있는 비디오 창iPad, iPhone(iOS 14+), Mac
AirPlay 2Apple TV 및 스피커로 무선 스트리밍모든 플랫폼
공간 오디오Dolby Atmos 및 동적 헤드 트래킹iOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG(디스플레이 지원)iOS 11+, macOS 10.13+

HLS 지원 및 적응형 전환

AVPlayer는 추가 라이브러리 없이 네이티브 HLS를 지원합니다. HLS 스트림 재생 시 AVPlayer는 Apple 플랫폼에 최적화된 내장 ABR 알고리즘을 사용하여 자동으로 적응형 비트레이트 전환을 처리합니다. 이 알고리즘은 네트워크 대역폭뿐만 아니라 기기의 열 상태도 고려합니다 — 과열 시 AVPlayer는 CPU 부하를 줄이기 위해 비트레이트를 낮출 수 있습니다.

FairPlay Streaming이 적용된 HLS 스트림의 경우 AVPlayer는 AVContentKeySession 델리게이트를 통해 자동으로 라이선스 획득 및 갱신을 처리합니다. 개발자는 AVContentKeySessionDelegate 프로토콜을 구현해야 하며, 복호화 키를 얻거나 갱신해야 할 때 플레이어가 이 프로토콜을 호출합니다. Widevine이 iOS에서 지원되지 않으므로 Apple 플랫폼에서 HLS 콘텐츠를 보호하는 유일한 방법입니다.

Picture in Picture

PiP는 앱 간 전환 시 사용자가 떠 있는 창에서 비디오를 계속 시청할 수 있는 모드입니다. iPad 및 iPhone(iOS 14+)에서 AVPlayer는 AVPictureInPictureController와 통합하여 이 모드를 활성화합니다. macOS 15+에서도 PiP를 사용할 수 있지만 시스템 메뉴나 플레이어 창의 버튼을 통해 활성화됩니다.

iOS 앱에서 AVPlayer 사용 방법

AVPlayer를 iOS 앱에 통합하는 방법은 두 가지입니다: 고수준 AVPlayerViewController를 통한 방법(표준 시나리오) 또는 AVPlayer + AVPlayerLayer를 직접 사용하는 방법(완전한 UI 사용자 지정). Swift에서 두 접근 방식을 살펴보겠습니다.

AVPlayerViewController를 통한 통합

AVPlayerViewController는 재생/일시 정지, 탐색, 볼륨, AirPlay, PiP 및 전체 화면 모드와 같은 내장 컨트롤을 제공하는 즉시 사용 가능한 UI 구성 요소입니다. 최소한의 통합에는 몇 줄의 코드만 필요합니다: AVPlayer 인스턴스를 만들고 AVPlayerViewController에 전달한 후 컨트롤러를 화면에 표시합니다.

swift
import AVKit

let url = URL(string: "https://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)

let controller = AVPlayerViewController()
controller.player = player
controller.allowsPictureInPicturePlayback = true

present(controller, animated: true) {
    player.play()
}

AVPlayerLayer를 통한 직접 통합

사용자 지정 UI가 있는 앱의 경우 AVPlayerLayer(모든 UIView 내에서 비디오를 렌더링하는 Core Animation 레이어)를 사용합니다. 이 접근 방식은 인터페이스를 완전히 제어할 수 있습니다: 사용자 지정 컨트롤, 애니메이션을 추가하고 비디오 위에 추가 레이어를 오버레이할 수 있습니다.

swift
class VideoPlayerView: UIView {

    var player: AVPlayer? {
        get { (layer as! AVPlayerLayer).player }
        set { (layer as! AVPlayerLayer).player = newValue }
    }

    override class var layerClass: AnyClass {
        AVPlayerLayer.self
    }
}

// 사용법:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)

AVPlayer 라이프사이클 관리

적절한 플레이어 라이프사이클 관리는 앱 안정성에 중요합니다. AVPlayer는 화면이 나타날 때 생성되고 닫힐 때 해제되어야 합니다. 앱이 백그라운드로 전환될 때는 리소스를 절약하고 불필요한 백그라운드 재생에 대한 App Review 패널티를 피하기 위해 재생을 일시 중지하는 것이 좋습니다.

AVPlayerLayer 및 비디오 표시

AVPlayerLayer는 CALayer에서 상속받는 Core Animation 레이어로, 화면에 비디오를 렌더링합니다. UIView와 달리 AVPlayerLayer는 Metal 또는 OpenGL을 통해 GPU와 직접 작동하여 최소한의 프레임 출력 지연을 보장합니다. 사용자 지정 재생 인터페이스를 구현하려면 AVPlayerLayer를 이해하는 것이 필수적입니다.

videoGravity 설정

videoGravity 속성은 비디오가 레이어 경계 내에 맞는 방식을 결정합니다. AVLayerVideoGravity.resizeAspect(검은 막대와 함께 종횡비 유지)는 AVPlayerViewController의 기본값입니다. resizeAspectFill(자르기와 함께 전체 화면 채우기)은 전체 화면 모드에 사용됩니다. resize(레이어 크기에 맞게 비율 왜곡)는 거의 사용되지 않으며 주로 분석 애플리케이션에 사용됩니다.

메인 스레드 동기화

AVPlayerLayer는 실시간으로 비디오를 렌더링하지만 모든 플레이어 작업(시작, 일시 정지, 탐색)은 메인 스레드에서 수행되어야 합니다. 관찰을 위한 주요 값(timeControlStatus, rate, status, error)은 KVO(Key-Value Observing) 또는 Swift Concurrency를 지원하는 AVPlayer 메서드를 통해 iOS 16에 도입된 최신 async/await API를 통해 추적됩니다.

swift
let player = AVPlayer(url: url)
let statusObservation = player.observe(
    \.status,
    options: [.new, .initial]
) { player, _ in
    switch player.status {
    case .readyToPlay:
        player.play()
    case .failed:
        handleError(player.error)
    default:
        break
    }
}

자막 및 대체 트랙 지원

AVPlayer는 VTT, CEA-608 및 ITT(iTunes Timed Text) 형식의 내장 자막을 지원합니다. 오디오 트랙 및 자막 선택은 AVMediaSelectionGroup 및 AVMediaSelectionOption을 통해 수행됩니다. 사용자 자막 설정(글꼴, 크기, 색상)은 시스템 접근성 설정에서 읽어와 코드에 명시적으로 지정되지 않는 한 AVPlayerLayer에 자동으로 적용됩니다.

재생 관리 및 고급 시나리오

프로덕션 애플리케이션의 경우 기본 AVPlayer 통합에는 종종 추가 구성이 필요합니다: HLS 세그먼트 캐싱, FairPlay DRM 통합, Now Playing 시스템 통합 및 사용자 지정 비트레이트 선택 알고리즘.

AVAssetResourceLoader를 통한 HLS 캐싱

AVAssetResourceLoader는 HLS 세그먼트 로딩을 가로채고 캐싱을 구현하는 유일한 방법입니다. AVAssetResourceLoaderDelegate는 키와 세그먼트에 대한 로딩 요청을 수신하여 로컬에 저장하고 후속 요청에서 캐시에서 반환할 수 있습니다. 이는 불안정한 네트워크 환경에서 작동하는 애플리케이션에 특히 유용합니다.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — DRM 통합

FairPlay Streaming(FPS)은 HLS 콘텐츠를 보호하기 위한 Apple의 표준입니다. FPS를 통합하려면 복호화 키 요청을 처리하는 AVContentKeySessionDelegate 프로토콜을 구현해야 합니다. 프로세스는 다음과 같습니다: 플레이어에서 SPC(서버 재생 컨텍스트)를 가져와 라이선스 서버에 보내고, CKC(콘텐츠 키 컨텍스트)를 수신하여 AVContentKeySession에 다시 전달합니다.

swift
class DRMDelegate: NSObject, AVContentKeySessionDelegate {

    func contentKeySession(
        _ session: AVContentKeySession,
        didProvide keyRequest: AVContentKeyRequest
    ) {
        // 1. keyRequest에서 SPC 가져오기
        // 2. SPC를 라이선스 서버에 보내기
        // 3. CKC를 가져와 keyRequest.processContentKeyResponse에 전달하기
    }
}

Now Playing 및 시스템 제어

잠금 화면, 제어 센터 및 Apple Watch에 현재 재생 정보를 표시하려면 MediaPlayer.framework의 MPNowPlayingInfoCenter를 사용하세요. AVPlayer는 자동으로 Now Playing을 업데이트하지 않습니다 — 개발자는 재생 상태가 변경될 때 수동으로 메타데이터(제목, 아티스트, 아트워크, 진행률)를 설정해야 합니다. 진행률 업데이트에는 정기 타이머 또는 observe(\.timeControlStatus)가 사용됩니다.

Remote Command Center는 잠금 화면, AirPods 및 CarPlay에서 재생을 제어할 수 있는 또 다른 시스템 서비스입니다. MPRemoteCommandCenter는 play, pause, nextTrack, previousTrack, changePlaybackPosition 및 skipForward/skipBackward 명령에 대한 핸들러를 등록합니다. AVPlayer는 이러한 명령을 자동으로 처리하지 않습니다 — 개발자가 player.play(), player.pause() 및 player.seek() 호출에 연결해야 합니다.

자주 묻는 질문

AVPlayer와 AVAudioPlayer는 어떻게 다른가요?

AVPlayer는 스트리밍, HLS, DRM 및 시스템 제어와의 동기화를 지원하는 범용 오디오 및 비디오 플레이어입니다. AVAudioPlayer는 스트리밍이나 하드웨어 비디오 가속 없이 로컬 오디오 파일 재생을 위한 단순화된 오디오 플레이어입니다. 비디오 및 HLS에는 AVPlayer를, 간단한 오디오에는 AVAudioPlayer를 사용하세요.

AVPlayer가 YouTube 재생을 지원하나요?

아니요, AVPlayer는 YouTube 콘텐츠를 직접 로드할 수 없습니다. YouTube는 DASH 및 독점 형식을 기반으로 자체 플레이어를 사용하기 때문입니다. iOS 앱에 YouTube를 통합하려면 WKWebView 또는 공식 youtube-ios-player-helper 라이브러리를 통해 YouTube IFrame Player API를 사용하세요.

AVPlayer로 백그라운드 오디오 재생을 구현하려면 어떻게 하나요?

백그라운드 오디오의 경우 Xcode 프로젝트의 Background Modes에 Audio, AirPlay and Picture in Picture를 추가하세요. AVAudioSession을 .playback 카테고리로 설정하세요: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer는 백그라운드에서 계속 재생되며, 잠금 화면과 제어 센터는 MPNowPlayingInfoCenter를 통해 제어 기능을 표시합니다.

AVPlayer가 YouTube, Vimeo 또는 Twitter의 비디오를 재생하지 않는 이유는 무엇인가요?

이러한 서비스는 DRM 보호와 자체 플레이어 솔루션을 사용합니다. AVPlayer는 직접 미디어 파일 URL 또는 HLS 재생 목록을 통해서만 콘텐츠를 재생할 수 있습니다. YouTube 및 유사 플랫폼의 비디오는 AVPlayer와 호환되지 않는 iframe 또는 JavaScript 플레이어에 래핑되어 있습니다. 표시에는 공식 SDK 또는 WebView를 사용하세요.

AVPlayer로 라이브 스트리밍의 지연 시간을 줄이려면 어떻게 하나요?

저지연 HLS의 경우 AVPlayerItem을 preferredForwardBufferDuration = 2.0(초)으로 설정하고 라이브 경계에서 뒤처질 때 자동으로 일시 중지를 관리하세요: player.currentItem?.configuredTimeOffsetFromLive 및 player.currentItem?.canPlayReverse를 사용하세요. Apple은 서버와 클라이언트 모두에서 올바르게 구성된 경우 2-4초 지연의 LL-HLS를 권장합니다.

요약

  • AVPlayer — iOS, macOS, tvOS 및 visionOS를 위해 Apple Silicon에서 하드웨어 가속을 제공하는 Apple의 범용 미디어 플레이어.
  • HLS — 추가 라이브러리 없이 자동 적응형 비트레이트 전환을 지원하는 네이티브 지원.
  • FairPlay Streaming — Apple 플랫폼에서 보호된 HLS를 위한 유일한 DRM 시스템.
  • 통합 — 빠른 시작을 위한 AVPlayerViewController 또는 사용자 지정 UI를 위한 AVPlayerLayer.
  • 캐싱 HLS는 세그먼트 요청을 가로채 AVAssetResourceLoaderDelegate를 통해 구현됩니다.
  • Now Playing — MPNowPlayingInfoCenter를 통한 제어 센터 및 잠금 화면용 수동 메타데이터 업데이트.
  • 권장 HLS 요구 사항이 있는 Apple 플랫폼의 모든 미디어 프로젝트에 AVPlayer를 사용하는 것이 좋습니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기