apple/Video, Audio, DRM

AVAudioFormat 정리

lgvv 2025. 11. 24. 23:58

AVAudioFormat 정리

 

AVAudioFormat에 대해서 정리하며 연관된 지식도 모두 함께 정리.

 

목차

  • AVAudioFormat
  • AVAudioFormat의 프로퍼티들
    • Getting the Audio Stream Description
      • streamDescription
    • Getting Audio Format Values
      • sampleRate
      • channelCount
      • channelLayout
      • formatDescription
    • Determining the Audio Format
      • isInterleaved
      • isStandard
      • commonFormat
      • settings
      • magicCookie
  • AVAudioFormat과 AudioStreamBasicDescription의 비교 정리
  • Channel과 ChannelLayout의 차이
  • AVAudioCommonFormat 정리

 

 

AVAudioFormat

 

오디오 포맷의 표현을 설명하는 객체

 

샘플 레이트, 채널 수 등을 포함하는 속성들을 포함하여 오디오 데이터가 어떤 구조로 구성되어 있는지를 알려주는 객체.

 

iOS 8.0+
iPadOS 8.0+
Mac Catalyst 13.1+
macOS 10.10+
tvOS 9.0+
visionOS 1.0+
watchOS 2.0+

 

Overview

AVAudioFormat 클래스는 Core Audio의 AudioStreamBasicDescription을 감싸는 래퍼.


Core Audio에서 표준으로 사용하는 디인터리브(Deinterleaved)된 32비트 부동소수점(Float32) 포맷을 포함

일반적인 오디오 포맷을 손쉽게 다룰 수 있도록 여러 초기화 메서드와 접근자를 제공

 

해당 클래스의 인스턴스 프로퍼티를 초기화 후에는 변경할 수 없음 (Immutable)

 

 

 

AVAudioFormat의 프로퍼티들

 

 

streamDescription

  • 오디오 데이터 스트림의 오디오 포맷 속성
  • 하위 레벨 오디오 API에서 사용할 수 있는 AudioStreamBasicDescription을 반환
var streamDescription: UnsafePointer<AudioStreamBasicDescription> { get }

 

 

 

sampleRate

  • 오디오 포맷의 샘플링 레이트(Hz 단위)
var sampleRate: Double { get }

 

 

 

channelCount

  • 오디오 데이터의 채널 수
    • AVAudioChannelCount는 UInt32로 이보다 큰 경우 런타임 에러가 발생할 수 있음.
var channelCount: AVAudioChannelCount { get }

 

 

 

channelLayout

  • 기본 오디오 채널 레이아웃
  • 2채널을 초과하는 포맷에서만 채널 레이아웃이 필요
var channelLayout: AVAudioChannelLayout? { get }

 

 


formatDescription

  • Core Media API와 함께 사용할 오디오 포맷
var formatDescription: CMAudioFormatDescription { get }

 

 

 

isInterleaved

  • 샘플이 하나의 스트림으로 믹스되는지 여부를 나타내는 불리언 값.
  • 이 값은 PCM 포맷에서만 유효.
var isInterleaved: Bool { get }

 

 

isStandard

  • 포맷이 디인터리브드(deinterleaved)된 네이티브 엔디안(float) 상태인지 여부를 나타내는 불리언 값
    • 이 값은 포맷이 AVAudioCommonFormat.pcmFormatFloat32일 경우 true를 반환
    • 그 외의 경우는 false를 반환
var isStandard: Bool { get }

 

 

 

commonFormat

  • AVAudioCommonFormat 식별자 인스턴스
var commonFormat: AVAudioCommonFormat { get }

 

 

 

settings

  • 이 설정에 들어가는 딕셔너리는 AudioStreamBasicDescription이 표현하는 모든 형식을 지원하지 않음.
  • 따라서 해당 포맷을 지원하지 않는 경우 이 속성은 nil을 반환
var settings: [String : Any] { get }

 

 

 

 

magicCookie

  • 인코더와 디코더가 필요로 하는 메타데이터를 포함한 객체.
  • 인코더는 magicCookie 객체를 생성하며 일부 디코더는 이를 통해 올바르게 디코딩을 수행할 수 있음.
    • 참고로 magicCookie는 AAC, ALAC 같은 일부 코덱은 압축 형식에 대한 추가 정보가 있어야 제대로 디코딩 할 수 있음.
    • 인코더는 이 정보를 생성해서 디코더에 전달해야 함.
var magicCookie: Data? { get set }

 

 

 

 

 

AVAudioFormat과 AudioStreamBasicDescription의 비교 정리

 

 

AVAudioFormat

  • AVFAduio 프레임워크에 속하며 오디오 엔진(API: AVAudioEngine, AVAudioPlayerNode 등)
  • Swift 환경에서 오디오 포맷을 다룰 때
  • 안전한 오디오 처리 로직을 구성할 때

목적: 오디오 포맷을 쉽게 다룰 수 있게 하는 추상화된 인터페이스

 

AudioStreamBasicDescription(ASBD)

  • Core Audio 프레임워크에 속하는 저수준 API을 위해서 사용
  • 직접 버퍼 관리, PCM 데이터 처리
  • 압축 및 비압축 오디오의 실제 패킷 구조를 다뤄야 하는 상황

목적: 하드웨어 수준에서 오디오 데이터를 정확히 기술하기 위한 로우 레벨 데이터 구조

 

 

Channel과 ChannelLayout의 차이

 

채널(Channel): 오디오 트랙 하나를 의미

  • 채널 레이아웃(Channel Layout): 채널이 물리적으로 어디에 배치되는지 나타냄
  • 5.1채널 이상이면 채널의 위치 정보가 필요합니다.

채널(Channel): 오디오 트랙 하나를 의미

  • 예: 모노 → 1채널
  • 스테레오 → 2채널 (왼쪽, 오른쪽)
  • 서라운드 5.1 → 6채널 (앞왼, 앞오, 중앙, 서브우퍼, 뒤왼, 뒤오)
    • 경우에 따라 다르지만 우퍼는 저음으로 방향이 존재하지 않아서 .1을 붙임.

채널 레이아웃(Channel Layout): 채널이 물리적으로 어디에 배치되는지 나타냄

  • 단순히 “채널 수 = 6”이라고 해도, 어떤 채널이 앞, 뒤, 좌, 우인지를 정의하지 않으면 스피커 배치가 올바르지 않을 수 있음
    • 그래서 2채널 이상일 때만 필요
    • 2채널 스테레오는 일반적으로 왼쪽과 오른쪽이 명확하기 때문에 레이아웃이 필수가 아니지만, 5.1채널 이상이면 각 채널의 위치 정보가 필요

 

 

AVAudioCommonFormat 정리

 

일반적인 오디오 포맷을 설명하는 포맷 옵션으로 Enum으로 설정.

 

 

  • otherFormat
    • AVAudioCommonFormat에서 정의하고 있는 것 외에 다른 형식
  • pcmFormatFloat32
    • 표준 형식을 네이티브 엔디언의 부동소수점(float) 형태로 표현한 형식
  • pcmFormatFloat64
    • 네이티브 엔디언(double) 형식으로 표현한 포맷
  • pcmFormatInt16
    • 서명된 16비트 네이티브 엔디언 정수(signed 16-bit native-endian integer)로 표현한 포맷
  • pcmFormatInt32
    • 서명된 32비트 네이티브 엔디언 정수(signed 32-bit native-endian integer)로 표현한 포맷

 

'apple > Video, Audio, DRM' 카테고리의 다른 글

AVAudioEngine, AVAudioNode 정리  (0) 2025.11.26
AudioStreamBasicDescription 정리  (0) 2025.11.24
AVAudioPCMBuffer 정리  (0) 2025.11.24
Adaptive Bit Streaming  (0) 2025.10.23
[HLS] Creating a Multivariant Playlist  (0) 2024.12.05