Prolog
레퍼런스 클래스 - 해당 타입의 기반이 되는 클래스로 동일한 기능의 사용을 위해서 상속 받아야하는 클래스
인터페이스 (or 프로토콜) - 메소드의 Function Type을 선언하여 하위 구현체들의 용도/행위를 정의하기 위한 추상클래스
About Video

비디오에 대한 이해
비디오는 기본적으로 정지 이미지(Frame) 가 시간 축을 따라 연속적으로 표시하면서 움직임을 인식하게 만드는 시각적 매체입니다. 하나의 비디오는 수많은 이미지 프레임으로 구성되며, 이 프레임들은 일정한 속도(프레임 레이트, fps)로 표시됩니다. 예를 들어 1초당 30장의 이미지를 순차적으로 보여주는 영상을 30fps라고 합니다. 이때 각 이미지(Frame)는 약 33.3ms 간격으로 화면에 표시되며, 인간의 시각은 이 빠른 변화 속에서 연속적인 움직임으로 인식합니다.
비디오는 "시간적으로 배열된 이미지 데이터의 연속 객체(Time-continuous sequence of still images)"이다.
이미지 프레임의 구성 요소
각 비디오 프레임(이미지)은 픽셀(pixel) 단위의 시각 정보로 구성되며, 각 픽셀은 색상 정보를 담습니다. 비디오 프레임에서 색상은 일반적으로 YUV 또는 RGB 색공간을 사용해 표현합니다.
| 색공간 | 설명 | 사용 |
| RGB | Red, Green, Blue의 가중합으로 색 표현 | 디스플레이, 그래픽 처리 |
| YUV (YCbCr) | 밝기(Y)와 색차(U, V)로 분리 | 비디오 압축 및 저장용 |
| YUV420 | 색 정보를 절반 이하로 축소 (압축 효율↑) | H.264, HEVC 등 대부분의 비디오 코덱 |
이처럼 비디오는 시각적으로는 RGB 형태로 보이지만, 실제 저장 시에는 YUV 포맷으로 변환되어 효율적으로 압축됩니다.
비디오를 구성하는 세 가지 핵심 요소
비디오는 단일 파일처럼 보이지만, 내부적으로는 세 가지 요소의 조합으로 구성됩니다.
| 구성 요소 | 설명 |
| Frame Data (이미지 데이터) | 연속된 이미지(픽셀 데이터) — 각 프레임은 RGB 또는 YUV 픽셀로 구성 |
| Audio Data (음성 트랙) | 영상과 동기화된 소리 데이터 — 샘플링 레이트 단위로 구성 |
| Metadata / Container | 시간 정보, 트랙 동기화, 자막, 인코딩 정보 등 |
프레임(이미지)들을 관리하고 비디오로 사용하기 위해서 시간 데이터와 함께 처리하려면 CoreVideo를 사용하고, 음성 데이터를 처리하기 위해서 CoreAudio를 사용합니다. 둘을 조합하여 동기화 및 편집, 재생, 인코딩은 AVFoundation을 이용하여 처리합니다.
비디오 컨테이너 포맷 (Video Container Formats)
컨테이너(Container) 는 영상, 오디오, 자막, 메타데이터를 하나의 파일로 묶는 포맷입니다. 즉, 컨테이너는 비디오 데이터를 담는 “그릇” 역할을 합니다. 실제 영상/오디오 데이터를 압축·복원하는 것은 코덱(Codec) 이 담당합니다.
| 포맷 | 확장자 | 특징 | 오디오/자막 지원 | iOS 지원 여부 | 비고 |
| MP4 (MPEG-4 Part 14) | .mp4 | 가장 범용적, H.264/H.265 등 포함 가능 | O | ✅ 완전 지원 | iOS 기본 표준 포맷 (AVPlayer, AVAsset 지원) |
| MOV (QuickTime File Format) | .mov | Apple 개발, 고품질 편집용 | O | ✅ 완전 지원 | iPhone 촬영 기본 포맷 (HEVC/H.264 내장) |
| M4V | .m4v | DRM 가능 MP4 변형 | O | ✅ 완전 지원 | iTunes, Apple TV 등에서 사용 |
| MKV (Matroska) | .mkv | 자막·여러 오디오 트랙 지원, 오픈소스 | O | ⚠️ 제한적 지원 (AVFoundation 직접 미지원) | 써드파티 프레임워크(FMX, VLC 등 필요) |
| AVI | .avi | 고전 포맷, 압축 비효율적 | X | ❌ 비공식 | iOS 미지원 (FFmpeg 등으로 변환 필요) |
| WEBM | .webm | 웹용, VP8/VP9 전용 | O | ⚠️ Safari 16+ 일부 지원 | WebKit 기반 HTML5 재생만 가능 |
| FLV | .flv | 플래시 기반 구형 포맷 | O | ❌ 미지원 | Flash 단종으로 사실상 사장됨 |
비디오 코덱 (Video Codec)
코덱(Codec) 은 “Coder-Decoder”의 약자로, 비디오 데이터를 압축(Encoding) 하고 다시 복원(Decoding) 하는 알고리즘입니다. 이는 비디오 용량을 줄이면서도 품질을 유지하기 위해 필수적입니다.
| 코덱 | 압축 방식 | 라이선스 | iOS 지원 여부 | 비고 |
| H.264 (AVC) | 블록 기반 압축 (Inter/Intra) | 🔒 특허 기반 (MPEG LA) | ✅ 완전 지원 | iOS 기본 디코더, 하드웨어 가속 가능 |
| H.265 (HEVC) | 고효율 압축 (H.264 대비 50% 효율↑) | 🔒 특허 기반 (MPEG LA, HEVC Advance) | ✅ iOS 11 이상 | iPhone 7 이후 하드웨어 가속 지원 |
| AV1 | 차세대 오픈 코덱 | 🆓 오픈소스 (AOM Alliance) | ⚠️ iOS 17+ 일부 지원 | Safari/WebKit 기반 스트리밍에 점진적 채택 중 |
| VP8 | 구글 오픈코덱 (H.264 대체용) | 🆓 오픈소스 | ⚠️ 제한적 (WebKit 기반) | WebRTC/웹캠 등 일부 API에서 가능 |
| VP9 | VP8 개선판 (HEVC 수준 효율) | 🆓 오픈소스 | ⚠️ Safari 16+ 일부 지원 | YouTube 스트리밍용 (iOS 네이티브 미지원) |
| ProRes | Apple 고품질 중간코덱 | 🔒 Apple 내부 라이선스 | ✅ 완전 지원 (macOS/iOS) | 편집용 포맷, Final Cut/AVFoundation 완벽 통합 |
| CineForm | 중간편집용 (Intermediate codec) | 🔒 GoPro 소유 | ❌ 미지원 | Apple 환경에서는 사용 불가 |
| MPEG-2 | 구형 방송용 | 🔒 특허 | ❌ 미지원 | 구형 DVD, 방송 표준 |
| Theora | 오픈소스 (VP 계열 이전) | 🆓 오픈소스 | ❌ 미지원 | 과거 오픈 미디어 시도, 현재는 폐기됨 |
코덱 내부 압축 방식
- Intra-frame Compression (프레임 내부 압축)
- 한 프레임 내부에서 유사한 블록을 예측하여 저장
- JPEG과 유사한 원리 (정지 영상 압축)
- Inter-frame Compression (프레임 간 압축)
- 이전/다음 프레임의 변화만 저장
- 시간적 중복 제거 → 용량 대폭 절감
- 대표 키 프레임 유형:
- I-frame : 완전한 프레임 (기준)
- P-frame : 이전 프레임 참조
- B-frame : 이전·다음 프레임 모두 참조
APIs
Data Processing
CVBuffer
Core Video 버퍼 레퍼런스 클래스
CVImageBuffer
서로 다른 타입의 이미지 데이터를 표현하기 위한 인터페이스
CVPixelBuffer
Main Memory에서 픽셀을 확보하기 윈한 이미지 버퍼. 프레임 생성 및 압축/해제 등을 위해서 사용
CVPixelBufferPool
Pixel Buffer 객체의 재사용을 위해서 사용하는 Pool
CVPixelFormatDescription
Pixel Buffer의 Pixel format을 정의하기 위해서 사용하는 구조체
Time Management
CVTime / CVTimeStamp
Core Video에서 사용하는 시간 값을 저장하기 위해서 사용하는 데이터 구조체. CVDisplayLink와 함께 사용 가능
CVDisplayLink
화면에서 각 프레임이 필요할 때는 알리기 위한 높은 우선순위의 스레드
Metal
CVMetalTextureCache
Metal 텍스처를 만들고 관리하기 위한 캐시
CVMetalTexture
이미지 버퍼 기반의 Metal 텍스처의 레퍼런스 클래스
OpenGL
CVOpenGLTextureCache
OpenGL 텍스처를 만들고 관리하기 위한 캐시
CVOpenGLTexture
OpenGL에 전달하기 위한 텍스처 기반의 이미지 버퍼
CVOpenGLBuffer
Video Memory 상에 이미지 데이터를 저장하기 위한 이미지 버퍼
CVOpenGLBufferPool
OpenGL 버퍼를 재사용하기 위한 사용하는 Pool
OpenGL ES (OpenGL for Embedded System)
CVOpenGLESTextureCache
OpenGL ES 텍스처를 만들고 관리하기 위한 캐시
CVOpenGLESTexture
OpenGL ES에 전달하기 위한 텍스처 기반의 이미지 버퍼
'Programming > Mac & iOS' 카테고리의 다른 글
| [iOS] Developer‘s Note (0) | 2025.11.05 |
|---|---|
| [iOS] AVFoundation Foundation (0) | 2025.11.02 |
| [iOS] Accelerate computing with Metal (0) | 2025.10.22 |
| [iOS] SwiftUI : View update에 대한 고찰 (0) | 2025.10.14 |
| [iOS] Swift Concurrency Foundation (0) | 2025.10.11 |