apple/Video, Audio, DRM

AVAudioPCMBuffer 정리

lgvv 2025. 11. 24. 00:32

AVAudioPCMBuffer 정리 

 

AVAudioPCMBuffer를 학습하고 이와 관련한 개념들을 정리.

 

 

목차

  • AVAudioPCMBuffer 선수 지식 정리
  • AVAudioPCMBuffer
  • AVAudioPCMBuffer의 인스턴스 프로퍼티
    • AVAudioPCMBuffer().frameLength
    • AVAudioPCMBuffer().frameCapacity
    • AVAudioPCMBuffer().stride
    • AVAudioPCMBuffer().floatChannelData
    • AVAudioPCMBuffer().int16ChannelData, AVAudioPCMBuffer().int32ChannelData

 

AVAudioPCMBuffer 선수 지식 정리

 

AVAudioPCMBuffer를 학습하기 전에 사전 개념으로 필요.

자세한 이론은 하단의 링크 참고.

 

  • PCM(Audio)란?
    • Pulse Code Modulation로 디지털 오디오의 가장 기본적인 형태를 의미.
    • 아날로그 소리를 일정한 간격으로 샘플링하고, 각 샘플을 디지털(숫자 값)으로 변환한 것.
    • 즉, PCM 오디오는 실제 소리의 진폭을 숫자로 표현한 샘플들의 배열
  • PCM buffer란?
    • PCM buffer는 PCM 오디오 샘플을 담고 있는 메모리 공간(버퍼)를 의미.
    • 즉, 오디오 데이터 배열을 담은 객체로 transcription, analyze, 재생 등 오디오 처리를 위해 사용
    • iOS에서는 AnalyzerInput이나 AVAudioPCMBuffer 같은 객체가 PCM Buffer를 제공.

 

분석, 전사, 신호 처리 등 연속된 샘플 데이터가 필요한데, PCM buffer는 이 샘플 데이터를 일정한 포맷으로 모아둔 컨테이너 역할.

 

샘플링 레이트(예: 16kHZ, 44.1kHz), 채널 수(에: 모노, 스트레오), 각 샘플의 비트 깊이(예: 16-bit, 24, bit) 등의 정보와 함께 PCM buffer를 분석 모듈에 제공하면 음성을 텍스트로 변환하거나 VAD(음성 감지) 등을 처리할 수 있음.

 

 

AVAudioPCMBuffer

 

PCM 오디오 포맷과 함께 사용하는 오디오 버퍼를 나타내는 객체

 

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

 

 

 

AVAudioPCMBuffer().frameLength

 

 

버퍼의 현재 유효 샘플 프레임 수

 

var frameLength: AVAudioFrameCount { get set }

 

  • 기본적으로 버퍼를 생성할 때 frameLength 속성은 유용한 값을 가지지 않으므로, 버퍼를 사용하기 전에 반드시 이 값을 설정.
  • frameLength 값은 버퍼의 frameCapacity보다 작거나 같아야 함.
  • deinterleaved 포맷에서는 frameCapacity각 채널의 오디오 샘플 수를 의미.
  • 버퍼 내용 수정 작업 중에 frameLength를 변경할 수 있음.
  • frameLength를 수정하면 내부 AudioBufferList 구조체의 각 AudioBuffer 속성에 있는 mDataByteSize 값도 자동으로 업데이트되며 그 반대도 마찬가지.

 

정리하자면, frameLength는 버퍼 안에서 실제로 사용 가능한 오디오 샘플의 길이를 나타내는 값.

버퍼를 분석, 재생, 전사 등에 사용하기 전에 정확하게 설정해 주어야 함.

 

 

 

AVAudioPCMBuffer().frameCapacity

 

버퍼가 담을 수 있는 오디오 샘플 프레임의 최대 용량

 

var frameCapacity: AVAudioFrameCount { get }

 

 

AVAudioPCMBuffer().stride

 

버퍼의 인터리브된 채널 수

 

var stride: Int { get }

 

 

AVAudioPCMBuffer().floatChannelData

 


버퍼의 오디오 샘플을 부동소수점(floating point) 값으로 나타낸 것.

 

var floatChannelData: UnsafePointer<UnsafeMutablePointer<Float>>? { get }

 

 

floatChannelData 속성

  • 버퍼의 포맷이 32비트 부동소수점(float)일 경우 버퍼의 오디오 샘플을 가리키는 포인터를 반환
  • 버퍼가 다른 포맷이라면 nil을 반환합니다.

 

반환되는 포인터 구조

  • 반환되는 포인터는 format.channelCount 개수만큼의 float 포인터 배열
  • 각 포인터는 frameLength만큼의 유효 샘플을 가리키며, 클래스는 샘플 간 stride 값에 따라 메모리를 배치.

 

포맷별 동작 차이

  1. 비인터리브(non-interleaved) 포맷
    • 표준 deinterleaved float 포맷처럼 각 채널은 별도의 메모리 영역을 가리킴.
    • 이 경우 stride 값은 항상 1
  2. 인터리브(interleaved) 포맷
    • 샘플이 채널별로 섞여(interleaved) 저장
    • 각 포인터는 동일한 버퍼를 가리키지만, 1프레임씩 오프셋(offset) 되어 있음.
    • 이 경우 stride 값은 인터리브된 채널 수를 나타냄.

 

 

interleaved과 non-interleaved에 대한 정리는 별도로 진행.

 

 

AVAudioPCMBuffer().int16ChannelData, AVAudioPCMBuffer().int32ChannelData

 

 

int16ChannelData

  • 버퍼의 16비트 정수 오디오 샘플
  • int16ChannelData 속성은 버퍼의 형식이 2바이트 정수 샘플인 경우 해당 오디오 샘플을 반환하며, 다른 형식의 경우에는 nil 반환

int32ChannelData

  • 버퍼의 32비트 정수 오디오 샘플
  • int16ChannelData 속성은 버퍼의 형식이 4바이트 정수 샘플인 경우 해당 오디오 샘플을 반환하며, 다른 형식의 경우에는 nil 반환

 

 

 

 

 

 

 

 

(링크)

 

https://developer.apple.com/documentation/AVFAudio/AVAudioPCMBuffer

 

AVAudioPCMBuffer | Apple Developer Documentation

An object that represents an audio buffer you use with PCM audio formats.

developer.apple.com

 

https://m.blog.naver.com/vasurada0/220987206351

 

누워서 읽는 디지털 오디오 포맷 1) PCM (오디오 CD)

아날로그 세계를 디지털로 기록하는 방법우리가 귀로 듣는 소리는 기본적으로 공기를 타고 전파되는 아날로...

blog.naver.com

 

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

AVAudioFormat 정리  (0) 2025.11.24
AudioStreamBasicDescription 정리  (0) 2025.11.24
Adaptive Bit Streaming  (0) 2025.10.23
[HLS] Creating a Multivariant Playlist  (0) 2024.12.05
[HLS] HTTP Live Streaming Overview  (0) 2024.12.05