Programming/Mac & iOS

[iOS] AVFoundation Foundation

MB Kyle K. 2025. 11. 2. 14:12

Prolog

Asset과 Track의 이해

asset은 하나 혹은 다수의 track으로 이루어져있다. track은 비디오 프레임, 오디오, 자막 등으로 재생에 이용되는 개별 컨텐츠를 의미한다. 이러한 컨텐츠들이 asset이라는 컨테이너에 담긴다. 플레이어는 asset이라는 컨테이너를 읽어와서, 각 track을 적절한 시간에 표시하여 재생한다.

 

 

AVAsset과 AVPlayerItem의 이해

AVAsset은 미디어를 담은 컨테이너인 asset의 데이터를 읽어오고 편집 등을 하기 위한 용도로 사용한다. 편집된거나 합성한 데이터를 읽거나 쓰기 위해서 사용되는 미디어 파일 그 자체라고 생각하면 된다. AVPlayerItem은 AVAsset을 재생하기 위해 사용하는 데이터 모델로서, 플레이어에서 재생에 관한 모든 제어를 위해서 사용하는 AVAsset의 재생 객체라고 생각하면 된다.

  AVAsset AVPlayerItem
핵심 개념 미디어의 정적 데이터(정보) 표현 객체 AVAsset을 기반으로 생성된 “재생 단위 객체”
주요 역할 미디어 파일(또는 스트림)의 구조, 트랙, 메타데이터 등을 표현 실제 재생을 담당하며, 재생 상태·시간·버퍼링 등을 관리
담는 정보 비디오·오디오 트랙, 자막, 메타데이터, 포맷, 길이 등 재생 시간, 버퍼 상태, 시킹, 로드 상태, 현재 트랙 등
불변성 여부 불변(immutable) — 미디어 데이터 자체의 정보만 표현 가변(mutable) — 재생 위치, 속도, 버퍼링 등 상태가 변함
생성 관계 AVURLAsset (파일·URL 기반), AVComposition (편집된 조합) 등으로 생성 AVPlayerItem(asset: AVAsset) 형태로 생성
재생 제어 ❌ 직접 재생 불가 ✅ AVPlayer와 연결되어 재생 제어 가능
시간·트랙 접근 asset.tracks, asset.duration, asset.metadata playerItem.tracks, playerItem.duration, playerItem.status
성능 초점 파일 구조 접근, 포맷 분석 실시간 스트리밍, 재생, 버퍼링 최적화
사용 목적 미디어의 정적 분석·편집·조합 재생 및 상태 제어 중심
관계 AVPlayerItem이 내부적으로 AVAsset을 참조 AVAsset은 AVPlayerItem 생성의 기반

 

오디오 세션과 권한 처리

오디오 세션을 처리하기 위해서 보통 카테고리모드를 설정하게 된다. 예전에는 HIG (Human Interface Guideline)에서 이 부분에 대해서 명확히 가이드를 해주었다. 물론, 현재에도 API document를 확인하면 용도를 확인할 수 있으나 표로 정리하면 훨씬 보기 쉽기에 아래에 정리된 표를 확인해보자.

 

카테고리

  목적 입력 출력 특징 사용
.ambient 음악 등 백그라운드 오디오 재생 (다른 앱 오디오와 공존 가능) 다른 앱의 사운드와 섞임 (mix 가능) 배경 음악 플레이어, 게임 BGM
.soloAmbient 단독 오디오 재생 (다른 앱 오디오 중단) 오디오 독점 재생 게임 효과음, 미디어 앱
.playback 고품질 오디오/비디오 재생 전용 사운드 출력 전용, 무음모드에서도 재생 가능 동영상 플레이어, 음악 앱
.record 마이크 입력(녹음) 전용 입력만 허용, 스피커 출력 없음 보이스 레코더
.playAndRecord 재생 + 녹음 동시에 입력·출력 동시 사용 (Echo 제어 포함) 영상통화, VoIP, 카메라 녹음 앱
.multiRoute 여러 오디오 경로(출력/입력) 동시 사용 AirPlay·USB·HDMI 등 멀티 채널 오디오 믹서, 전문 방송 앱

 

모드

  목적 특징 카테고리 사용
.default 기본 오디오 동작 시스템 기본 라우팅 사용 (특별한 튜닝 없음) 모든 카테고리 일반 오디오 앱
.videoRecording 비디오 녹화 시 음성 캡처 카메라 녹화 중 마이크 입력을 위해 자동 조정됨 .playAndRecord 카메라, 영상 촬영 앱
.voiceChat 실시간 음성 대화용 에코 제거(Echo Cancellation), 자동 이득 제어(AGC), 노이즈 억제 포함 .playAndRecord FaceTime, Zoom, 음성통화 앱
.videoChat 실시간 영상 통화용 (iOS 17+) voiceChat 기능에 더해 비디오 통신용 오디오 최적화 (네트워크 지연, 압축에 맞춘 EQ) .playAndRecord FaceTime, Teams, WhatsApp Video Call
.gameChat 게임 내 음성 채팅 게임용 음성 대화 최적화 (Echo 제어, 주변 소리 강조) .playAndRecord 온라인 멀티플레이 게임
.spokenAudio 오디오북, TTS 등 음성 콘텐츠 재생 중 음악·Podcast를 자동으로 낮추는 Ducking 효과 적용 .playback, .ambient Siri, 오디오북, 내비게이션 음성 안내
.voicePrompt 짧은 음성 프롬프트 (iOS 17+) 짧은 음성 피드백용, 다른 오디오를 순간적으로 Ducking 시킴 .playback, .ambient AirPods 알림음, 시스템 피드백
.measurement 음향 신호 분석용 시스템 처리 최소화 (AGC·노이즈 억제 비활성화) .record, .playAndRecord 악기 튜너, 소음 측정기
.moviePlayback 영화·미디어 재생용 (Deprecated) 이전 시스템 호환용, .playback으로 대체됨 .playback 구형 미디어 앱
.videoChat 영상통화 전용 (iOS 17+) 영상 통화 환경의 마이크·스피커 튜닝 강화 .playAndRecord 영상회의, 화상통화 앱

 

 

Composition의 종류와 설명

composition을 사용해서 기존의 미디어 파일을 읽어와서 수정이 가능하다. 우리가 보통 비디오의 프레임과 오디오 등을 편집 믹싱할 때에 사용하면 된다고 생각한다. 그 외에 비디오에 스티커나 기타 효과를 추가하기 위해서는 AVVideoCompositionCoreAnimationTool 등을 사용한다.

  목적 담당영역 주요 구성 수정 가능 여부 사용 예시
AVComposition 여러 트랙(비디오, 오디오 등)을 시간 축으로 병합하여 하나의 타임라인을 구성 타임라인 레벨 AVCompositionTrack, AVCompositionTrackSegment ❌ (immutable) 재생 전용, 완성된 타임라인 로드
AVMutableComposition AVComposition의 편집 가능한 버전, 트랙 추가·삭제·시간 편집 가능 타임라인 편집 레벨 AVMutableCompositionTrack ✅ (mutable) 비디오 편집 앱, 클립 병합
AVCompositionTrack 특정 미디어 타입(비디오/오디오 등)의 시간 축 표현 트랙 레벨 AVCompositionTrackSegment 개별 트랙 참조
AVMutableCompositionTrack CompositionTrack의 수정 가능한 버전 트랙 편집 레벨 insertTimeRange(), removeTimeRange() 등 비디오/오디오 클립 추가, 트랙 교체
AVCompositionTrackSegment 트랙의 특정 구간 (미디어 파일의 부분) 표현 세그먼트 레벨 sourceURL, timeMapping ✅ (대체 가능) 특정 클립 구간만 삽입
AVVideoComposition 비디오 트랙에 대한 렌더링 규칙(비주얼 효과, 전환 등) 정의 렌더링 파이프라인 AVVideoCompositionInstruction, AVVideoCompositionLayerInstruction 트랜지션, 색보정, 필터 적용
AVVideoCompositionCoreAnimationTool Core Animation Layer를 비디오에 합성하기 위한 도구 그래픽 합성 CALayer, animationLayer, postProcessingLayer 자막, 오버레이, UI 그래픽 삽입
AVAudioMix 오디오 트랙의 볼륨, 팬, 페이드 인/아웃 등 믹싱 제어 오디오 처리 파이프라인 AVAudioMixInputParameters 배경음+내레이션 믹싱

 

APIs

Media assets

AVAsset
동영상, 오디오, HLS 등의 미디어 파일을 담는 asset model. 각 asset은 AVAssetTrack으로 담기며, AVAsset은 하나 이상의 AVAssetTrack을 담고 있는 컨테이너이다. 

 
AVURLAsset
AVAsset을 local URL 혹은 remote URL을 통하여 생성. 당연하게도 AVAsset의 subclass이다. 생성자의 options 파라미터를 통해서 다양한 설정 값의 조정이 가능하다. 대표적으로 cellular network를 통해서 미디어를 불러올 수 있게할지 말지 등도 설정이 가능하다. option은 여기서 확인이 가능하다
 
AVAssetTrack
실제 미디어를 담고 있는 객체. AVAsset에 담겨져서 사용한다. 다양한 타입의 미디어를 사용 가능하다. 대표적으로 영상, 소리, 자막 등이다. 사용 가능한 미디어 타입은 여기서 확인이 가능하다. AVAsset을 통해서 객체가 생성됬다고 로드되지 않는다. 실제 재생이 필요한 시점에 로드된다.
 
AVAssetTrackSegment
각 AVAssetTrack을 로드하면 여러 segment로 로드된다. 각 segment는 AVAssetTrackSegment 객체로 표현되어 사용한다. 각 time range 별로 메타데이터를 표시한다. 각 segment 별로 track을 편집하고 싶다면, AVCompositionTrack과 AVCompositionTrackSegment를 사용한다.
 
AVAssetTrackGroup
관련된 track의 묶음. 한번에 재생되어야하는 track들을 묶어서 관리하는데 사용한다.
 

Media reading

AVAssetReader
AVAsset의 데이터를 읽기 위해서 사용한다.
 
AVAssetReaderOutput
AVAssetReader를 통해서 읽어온 데이터의 추상 클래스이다. 실제로는 각 데이터의 성격에 따라서 AVAssetReaderOutput을 상속 받아 구현된 클래스를 사용한다.
 
AVAssetReaderTrackOutput
단일 track의 데이터를 읽기 위해서 사용한다.
 
AVAssetReaderAudioMixOutput
믹스된 오디오를 읽어오는 데에 사용한다.
 
AVAssetReaderVideoCompositionOutput
합성된 비디오를 읽어오는 데에 사용한다.
 
AVAssetReaderSampleReferenceOutput
위에 설명된 오디오/비디오 등의 데이터를 직접 읽어오지 않고, 어디에 위치하는지 등에 대한 샘플 데이터만 읽어온다. 실제 미디어 데이터를 읽지 않고 reference만 제공하기 때문에 메모리에 부담 없이 데이터를 읽어올 수 있다.
 
AVAssetReaderOutputMetadataAdaptor
AVTimedMetadataGroup으로 각 샘플의 메타데이터를 읽어오기 위한 클래스.
 

Media writing

AVAssetWriter
AVAsset을 파일에 쓰기 위한 객체. 읽어온 혹은 편집된 AVAsset을 파일로 저장하기 위해서 사용한다.
 
AVAssetWriterInput
AVAssetWriter를 통해서 데이터를 쓰기위해서 실제 track을 주입하기 위한 객체이다.
 
AVAssetWriterInputPixelBufferAdaptor
프레임을 나타내는 CVPixelBuffer를 AVAssetWriterInput으로 추가하기 위해서 사용하는 객체. 내부적으로 CVPixelBufferPool을 사용하여 주입받은 CVPixelBuffer를 위한 메모리 할당을 관리한다.
 
AVAssetWriterInputTaggerPixelBufferGroupAdaptor
일련의 프레임들을 나타내는 CVPixelBuffer들을 tagged group으로 관리하여, AVAssetWriterInput으로 추가하기 위해서 사용하는 객체. 내부적으로 CVPixelBufferPool을 사용하여 주입받은 CVPixelBuffer를 위한 메모리 할당을 관리한다.
 
AVAssetWriterInputMetadataAdaptor
AVTimedMetadataGroup으로 각 샘플의 메타데이터를 쓰기 위해 주입하는 클래스.
 
AVAssetWriterInpurtGroup
상호배제가 필요한 트랙들을 그룹으로 관리하여 주입할 때 사용한다. 예를 들어서, 각 언어 별로 구성된 오디오 데이터가 있다. 이 오디오 데이터는 사용자가 설정한 언어에 대해서만 하나의 트랙만 재생해야한다. 이런 경우는 각 언어별 오디오 데이터를 그룹으로 묶어서, AVAssetWriterInpurtGroup로 주입한다.
 

Captions

AVCaption / AVMutableCaption
time range 별로 표시할 텍스트 데이터 객체
 
AVCaptionRegion / AVMutableCaptionRegion
화면상에 표시할 텍스트의 위치를 표현하는 객체. 상단 / 하단 / 좌우 등의 위치를 설정한다.
 
AVCaptionGroup
상호배제적인 AVCaption을 그룹으로 묶어서 관리하기 위한 객체. 예를 들어서, 각 언어별 자막을 묶어거 관리하는데에 쓰인다.
 
AVCaptionGrouper
각 텍스트를 시간 구간별로 관리하기 위한 객체. 동시에 표시하거나 교차로 텍스트를 표시해야할 경우에 사용한다.
 
AVCaptionRanderer
실제 자막을 렌더링하는데 사용하는 객체. 아래와 같이 자막을 생성 / 묶음 / 표시하는 과정을 거친다.

[1] AVCaption (텍스트 단위)
   ↓
[2] AVCaptionGroup (시간 기반 묶음)
   ↓
[3] AVCaptionGrouper (자동 그룹화 도구)
   ↓
[4] AVCaptionRenderer (시각적 렌더링)
   ↓
[5] CALayer / Metal / CoreAnimation

 
AVAssetReaderOutputCaptionAdaptor
asset track으로부터 caption group을 읽어오는데 사용한다.
 
AVAssetWriterInputCaptionAdaptor
AVAssetWirterInput을 통해서 AVCaption 혹은 AVCaptionGroup을 주입하는데 사용한다.
 

Playback

AVPlayer

local / remote file 미디어를 재생을 위한 메소드 인터페이스를 갖춘 플레이어. AVPlayer를 기반으로 플레이어를 사용하는 여러 클래스 생성된다. AVAsset은 정적인 미디어의 데이터 읽기/편집/쓰기에 사용이 되며, AVPlayer와 같은 동적인 재생 동작을 위해서는 AVPlayerItem을 사용한다. 플레이어의 상태를 받아오는 방법은 KVO를 사용한 방법과 AVPlayer에서 제공하는 메소드를 통해서 지속적으로 변하는 시간 값을 받아오는 방법 등이 있다. AVPlayer는 실제 화면을 가지고 있는 객체가 아니기 때문에 재생 중인 미디어를 화면에 표시하기 위해서는 2가지 방법이 있다. AVKit을 활용하여 이미 화면까지 패키징되어 있는 클래스를 사용하는 방법이 있다. 또 다른 방법은 AVPlayerLayer를 이용하여 플레이어 UI를 커스터마이징하는 방법이다. 미디어가 표시되는 화면 외에 또다른 UI 요소를 추가하기 위해서는 AVSynchronizedLayer를 이용한다.


AVPlayerItem

asset의 재생을 위한 모델 객체


AVPlayerItemTrack

asset track의 재생을 위한 모델 객체


AVQueuePlayer

player item 들의 일련의 재생을 위한 플레이어 객체


AVPlayerLooper
AVQueuePlayer를 사용한 반복 재생을 위해서 사용하는 객체

 

Capture

AVCaptureSession

실시간 캡쳐를 위한 객체. input과 output을 설정하여 기록이 가능하다.


AVCaptureInput / AVCaptureOutput

capture session에 input/output을 설정하기 위해서 사용하는 추상클래스


AVCaptureConnection

capture input에서 capture output까지의 연결을 표현하기 위해서 사용하는 객체


AVCaptureDevice

카메라나 마이크 같은 하드웨어나 가상 기기 등을 표현하기 위한 객체
 

Editing

AVComposition

여러 미디어 트랙이 포함된 컨테이너로서 미디어의 편집 및 합성을 위해서 사용한다.


AVCompositionTrack

미디어의 개별 트랙을 편집 및 합성하기 위해서 사용한다.


AVCompositionTrackSegment

개별 트랙 내의 segment의 편집 및 합성하기 위해서 사용한다.


AVMovie

AVAsset으로 지원하지 않는 QuickTime movie model의 포맷을 지원한다.


AVMovieTrack

QuickTime / ISO 기반의 movie의 개별 track의 포맷을 지원한다.


AVVideoComposition

AVComposition은 미디어 및 트랙을 이어 붙이거나 추가하기 위한 객체라면, AVVideoComposition은 해당 미디어를 어떻게 표시할지에 대한 편집/합성을 지원한다. 투명도나 트랜스폼 등을 지원하여 화면이 어떻게 표기될지를 정의할 수 있다.


AVVideoCompositionCoreAnimationTool

미디어가 재생하는 화면 위에 animation을 추가할 수 있다. 일반적인 shorts의 stickers나 effects를 생각하면 된다.


AVAudioMix
오디오 트랙의 볼륨, 페이드 인/아웃, 믹싱 등을 지원하는 객체

 

Audio

AVAudioSession

앱 내에서 오디오 사용을 위해서 시스템에 세션 사용에 대한 communacation을 위해서 사용하는 객체


AVAudioApplication

앱에서 처리하는 하나 이상의 오디오 세션을 관리하기 위해서 사용하는 객체. 앱 내에서 모든 세션을 통틀어서 권한 및 설정을 관리하는데 주로 사용한다.


AVAudioPlayer

오디오 버퍼나 파일을 재생하기 위해서 사용하는 객체


AVAudioRecorder

오디오 데이터를 파일로 녹은하기 위해서 사용하는 객체


AVMIDIPlayer

MIDI 데이터를 재생하기 위해서 사용하는 객체


AVSpeechUtterance

소리를 내기위해서 텍스트를 가지는 객체


AVSpeechSynthesisVoice

소리를 내기위해서 사용하는 목소리

 

AVSpeechSynthesizer

AVSpeechUtterance가 가지고 있는 텍스트를 실제로 소리로 변환하는 객체.