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 값에 따라 메모리를 배치.
포맷별 동작 차이
- 비인터리브(non-interleaved) 포맷
- 표준 deinterleaved float 포맷처럼 각 채널은 별도의 메모리 영역을 가리킴.
- 이 경우 stride 값은 항상 1
- 인터리브(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 |