Apple🍎
🎧 AVFoundation 오디오 분석을 위한 데이터 다루기
생각 깎는 아이
2025. 4. 24. 21:48
📦 1. 미디어 파일 구조 이해
🔹 컨테이너와 트랙
- .mp4, .mov, .m4a 등은 컨테이너 형식
- 컨테이너 내부에는 여러 트랙이 존재
- 🎥 Video Track
- 🎧 Audio Track
- 💬 Subtitle Track 등
👉 AVAsset을 통해 각 트랙을 구분하고 추출할 수 있다.
🎵 2. 오디오 트랙 추출
let asset = AVAsset(url: fileURL)
let audioTracks = asset.tracks(withMediaType: .audio)
- 오디오 트랙만 골라서 가져올 수 있음
- 여러 오디오 트랙이 있을 수 있으므로 필요한 경우 조건 필터링 필요
- .mp3는 트랙 기반이 아니라서 예외 처리 필요
🧪 3. AVAssetReader + AVAssetReaderTrackOutput
컴포넌트 역할
AVAssetReader | 오디오 데이터를 읽는 기계 |
AVAssetReaderTrackOutput | 어떤 트랙을 어떤 포맷으로 읽을지 설정 (디코딩 설정 포함) |
reader.add(output) | Reader에 해당 설정을 추가 |
reader.startReading() | 본격적으로 읽기 시작 |
copyNextSampleBuffer() | 샘플 버퍼 하나씩 읽어옴 |
🔄 4. AAC → PCM 디코딩
대부분 영상의 오디오는 AAC 등 압축 포맷 → 분석하기 위해서는 Linear PCM(무압축) 으로 변환 필요
AAC (Advanced Audio Coding)
AAC는 디지털 오디오 압축을 위한 손실 코덱으로, MP3의 후속 표준으로 개발되었습니다.
AAC의 주요 특징
- 효율적인 압축: 같은 비트레이트에서 MP3보다 우수한 음질 제공
- 개발 배경: MPEG-2 및 MPEG-4 오디오 표준의 일부로 개발
- 지원 채널: 최대 48개 오디오 채널 지원 가능
- 샘플링 레이트: 8kHz에서 96kHz까지 다양한 샘플링 레이트 지원
- 비트레이트: 8kbps(낮은 음질)부터 529kbps(매우 높은 음질)까지 지원
AAC의 변형
- AAC-LC (Low Complexity): 가장 일반적인 AAC 프로파일, 좋은 음질과 적절한 압축률
- HE-AAC (High-Efficiency): 저비트레이트에서 효과적, 모바일 스트리밍에 적합
- AAC-LD (Low Delay): 낮은 지연시간, 화상 회의 등에 사용
일반적인 사용처
- Apple iTunes 및 iOS 기기
- YouTube, Netflix 등 스트리밍 서비스
- 디지털 라디오 방송(DAB+)
- 많은 스마트폰과 포터블 오디오 플레이어
PCM (Pulse Code Modulation)
PCM은 아날로그 신호를 디지털로 변환하는 가장 기본적인 방식으로, 비압축 디지털 오디오의 표준입니다.
PCM의 주요 특징
- 비압축 포맷: 원본 오디오 데이터를 그대로 디지털화하여 저장
- 원리: 아날로그 신호를 일정 간격으로 샘플링하고 각 샘플의 진폭을 이진수로 양자화
- 정확도: 비트 깊이가 높을수록 더 정확한 오디오 재현 가능
- 파일 크기: 압축을 사용하지 않아 파일 크기가 큼
PCM 관련 형식
- WAV (Waveform Audio File Format): Microsoft와 IBM이 개발한 PCM 컨테이너 포맷
- AIFF (Audio Interchange File Format): Apple이 개발한 PCM 컨테이너 포맷
- LPCM (Linear PCM): 선형 양자화를 사용하는 PCM의 한 형태, CD와 DVD에 사용
PCM 사양 예시
- CD 품질: 44.1kHz 샘플링 레이트, 16비트 깊이, 스테레오 (1,411kbps)
- DVD 오디오: 최대 192kHz 샘플링 레이트, 24비트 깊이 지원
- 프로 오디오: 일반적으로 48kHz 또는 96kHz, 24비트 사용
일반적인 사용처
- 오디오 CD
- 전문 음악 녹음 및 마스터링
- 영화 사운드트랙 제작
- 고품질 디지털 오디오 작업
AAC와 PCM 비교
압축 방식 | 손실 압축 | 비압축 |
파일 크기 | 작음 (원본의 약 1/10) | 큼 (원본 그대로) |
음질 | 비트레이트에 따라 다양 | 최고 품질 (원본) |
처리 요구사항 | 디코딩에 CPU 자원 필요 | 상대적으로 적은 처리 요구 |
주요 용도 | 스트리밍, 휴대용 기기 | 전문 오디오 작업, 마스터링 |
파일 확장자 | .aac, .m4a | .wav, .aiff, .pcm |
AAC는 효율적인 압축과 휴대성이 필요한 소비자용 애플리케이션에 적합한 반면, PCM은 최고 품질의 오디오가 필요한 전문적인 음악 제작 환경에 주로 사용됩니다.
🔧 5. outputSettings 설정 (AVFoundation) 파라미터 종류
let settings: [String: Any] = [
AVFormatIDKey: kAudioFormatLinearPCM,
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 1,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsFloatKey: false,
AVLinearPCMIsBigEndianKey: false,
AVLinearPCMIsNonInterleaved: false
]
🔹 AVFormatIDKey: kAudioFormatLinearPCM
- 우리는 PCM 포맷으로 받고 싶다는 걸 의미, 여기서 이걸 설정하면 디코더가 압축 해제해서 PCM으로 변환해 줌.
🔹 AVSampleRateKey: 44100
- 초당 샘플 수 (Hz).
- CD 음질과 동일한 값이 44,100Hz.
- 너무 높이면 용량 커지고, 너무 낮으면 품질 떨어짐.
- 사실 이건 필수는 아니고, 디코더가 자동으로 맞춰줄 수 있음.
🔹 AVNumberOfChannelsKey: 1
- 오디오 채널 수
- 1이면 모노
- 2이면 스테레오 (왼쪽/오른쪽)
- 왜 1로 쓰냐면
- 무음 감지나 분석 작업엔 채널 하나면 충분하고,
- 처리도 단순해져서 성능 ↑
🔹 AVLinearPCMBitDepthKey: 16
- 샘플 하나당 몇 비트냐? → 정밀도
- 16bit: -32,768 ~ 32,767 (정수)
- 32bit: 훨씬 더 넓은 범위 or Float
- 보통 16bit Int로 하면 메모리 효율이 좋고, 분석도 쉽다.
🔹 AVLinearPCMIsFloatKey: false
- false면 정수(Int16)
- true면 Float32
- true로 하면 RMS 계산은 더 직관적이지만, CPU 부담 약간 늘어남
🔹 AVLinearPCMIsBigEndianKey: false
- false: 리틀 엔디안 (macOS/Intel 기본)
- true: 빅 엔디안 (옛날 PowerPC 등에서 사용)
대부분의 macOS/Intel은 리틀 엔디안이므로 false가 기본값
🔹 AVLinearPCMIsNonInterleaved: false
- 오디오가 인터리브(Interleaved) 되어 있냐는 뜻
- 예시:
- 인터리브: [L1, R1, L2, R2, L3, R3, ...]
- 논인터리브: [L1, L2, L3, ...] [R1, R2, R3, ...] ← 채널별로 나눠진 배열
모노에서는 큰 차이 없지만, 스테레오 처리 시 차이 큼
우리는 false로 두면 일반적인 방식이고, Float 사용하면 종종 true도 씀
🧱 6. 샘플 버퍼 읽기 구조
while let sampleBuffer = output.copyNextSampleBuffer() {
let blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer)
let dataPointer = ... // 포인터 접근
let samples = UnsafeBufferPointer<Int16>
}
- 오디오 데이터를 정수 배열로 직접 접근 가능
- 이후 RMS 계산, dB 분석, 무음 탐지 등에 사용
🛠 특수 케이스
케이스 대응 방법
.mp3 파일 | 트랙 기반 아님 → AVAudioFile, AVAudioEngine 추천 |
오디오 트랙 여러 개 | estimatedDataRate 등으로 유효 트랙 판별 |
Float로 처리 | AVLinearPCMIsFloatKey: true, BitDepth: 32, vDSP 분석 적합 |
✅ 최종 분석 흐름 요약
1. AVAsset 로드
2. .audio 트랙 선택
3. AVAssetReader + Output 설정 (PCM 디코딩)
4. 샘플 버퍼 반복 추출
5. 샘플 → Int 배열 변환
6. RMS / dB / 무음 감지 등 분석