ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🎧 AVFoundation 오디오 분석을 위한 데이터 다루기
    Apple🍎 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 / 무음 감지 등 분석
    

    댓글

Designed by Tistory.