프로그래밍/기타

wav 파일의 pcm codec들은 각각 어떤 의미일까?

동네로봇 2022. 1. 30. 16:28

현재 회사에서 음원 서비스를 다루게 되면서 단순하게 wav는 pcm data를 담고 있는 품질 좋은 오디오 파일이다 라고만 알고 있었지만, 업무 이해도를 높이기 위해서 조금 더 자세히 알아야 할 필요성을 느꼈다. 

 

예를 들어 위 샘플 파일에서 보이는 것처럼, wav 파일의 오디오 코덱 형식을 체크할 때 pcm_s16le 에서 s16le가 도대체 뭘 의미하는 것인지, pcm 자체가 코덱인 것인지 헷갈리기 시작했다. 

 

pcm codec의 종류는 뭘 의미하는 것인지에 대해서 이것저것 찾아보던 중 내 의문점을 해결해준 REDDIT의 글을 발견했고, 정리하는 겸 지식 공유 겸 해당 댓글을 번역하여 이 글에 정리하고자 한다.

 

 

사전 정리

WAV (WAVE = Waveform audio format)

WAV 파일 포맷은 컨테이너에 무손실, 무압축의 청크 단위의 오디오 데이터를 저장하고 있다. AVI와 같이 Windows에서 오디오 및 비디오 파일을 저장하는 데 사용하는 일반적인 방법이지만 임의 데이터에도 사용할 수 있다.

WAV 파일은 음원의 원본을 그대로 저장하고 있어 일반적으로 압축되지 않은 상태이기 때문에, MP3와 같은 다른 대중적인 오디오 파일 형식보다 훨씬 더 크기가 크다. 이 때문에, 그들은 주로 전문 음악 산업에서 최고의 음질을 유지하기 위해 사용된다.

 

PCM (Pulse Code Modulation 펄스 부호 변조)

PCM은 아날로그 신호의 디지털 표현으로, 신호 등급을 균일한 주기로 표본화한 다음 디지털 (이진) 코드로 양자화 처리하는 표현 방식이다. WAV 파일 컨테이너에는 다양한 PCM 코덱을 통해 변환된 디지털 오디오 데이터를 담고 있는 PCM data 가 저장될 수 있다. 

 

ffmpeg으로 확인할 수 있는 PCM CODEC

ffmpeg -formats | grep PCM
alaw     PCM A-law
f32be    PCM 32-bit floating-point big-endian
f32le    PCM 32-bit floating-point little-endian
f64be    PCM 64-bit floating-point big-endian
f64le    PCM 64-bit floating-point little-endian
mulaw    PCM mu-law
s16be    PCM signed 16-bit big-endian
s16le    PCM signed 16-bit little-endian
s24be    PCM signed 24-bit big-endian
s24le    PCM signed 24-bit little-endian
s32be    PCM signed 32-bit big-endian
s32le    PCM signed 32-bit little-endian
s8       PCM signed 8-bit
u16be    PCM unsigned 16-bit big-endian
u16le    PCM unsigned 16-bit little-endian
u24be    PCM unsigned 24-bit big-endian
u24le    PCM unsigned 24-bit little-endian
u32be    PCM unsigned 32-bit big-endian
u32le    PCM unsigned 32-bit little-endian
u8       PCM unsigned 8-bit

 


원문 https://www.reddit.com/r/ffmpeg/comments/ijsv4c/what_is_exactly_the_difference_between_all_these/

 

What is exactly the difference between all these PCM options?

Posted in r/ffmpeg by u/xwxw779 • 3 points and 18 comments

www.reddit.com

 

Kofflay의 댓글 번역

 

대부분 이런 옵션들의 차이점은 오디오 데이터 그 자체의 숫자 데이터를 어떤 포맷으로 저장할 것인지에 대한 것이다. 

 

먼저, LE와 BE는 단순히 바이트의 순서를 의미한다.  https://en.wikipedia.org/wiki/Endianness 예를 들어 숫자 23451의 경우 16비트의 단어로 저장될 때 01011011 10011011 또는 10011011 01011011(뒤집힌 순서) 로서 저장된다. 그래서 이것은 그렇게 중요한 요소가 아니며 오디오 퀄리티에 큰 영향을 주지 않는다. 

 

S = signed integer number(부호 있는 정수), U = unsigned integer number(부호 없는 정수).

 

s8 (signed integer 8-bit number)은 -128 ~ 127 범위의 숫자를 저장할 수 있다. WAV 파일의 오디오 데이터를 나타내는 숫자가 이 범위에 저장된다. 예를 들어, 90은 01011010 또는 0x5A로 표시되고 -50은 11001110으로 표시된다 (맨 처음 0/1 자리는 +/- 부호를 의미한다).

 

s16 (signed integer 16-bit number)은 -32768 ~ 32767 범위의 숫자를 저장할 수 있다. 예를 들어 5678은 00010100 00101110로 나타낸다. 

 

s24 (signed integer 24-bit number)은 -8388608 ~ 8388607 범위의 숫자를 저장할 수 있다. 예를 들어 1874651은00011100 10011010 11011011로 나타낸다.

 

s32 (signed integer 32-bit number)은  -2 147 483 648 ~ 2 147 483 647 범위의 숫자를 저장할 수 있다. 예를 들어658 943 135은 00100111 01000110 10101100 10011111 (32 진수 또는 32 비트)로 나타낸다.

 

u16 (unsigned integer 16-bit number)은 0 ~ 65535 범위의 숫자를 저장할 수 있다. 

 

u24 (unsigned integer 24-bit number)은 0 ~ 16777215 범위의 숫자를 저장할 수 있다. (예를 들어, 24비트 컬러 디스플레이는 16777216가지의 다른 색상을 제공할 수 있다.)

 

u32 (unsigned integer 32-bit number)은  0 ~ 4 294 967 295 범위의 숫자를 저장할 수 있다. 

 

범위가 넓을 수록, 더 디테일한 오디오 정보를 얻을 수 있다. 색상표처럼 8-비트 색 구성표는 256개의 색상을 제공하지만 24비트 색 구성표는 16777216개의 색상을 제공한다. 하지만 어느 지점에 다다르면 이 깊이는 조금 과도해진다. 색에 있어서는 8에서 10비트 정도가 되어야 하는데(즉, 모든 픽셀은 16777216 ~ 1073741824 사이의 다른 색상으로 이루어져야 한다), 그것은 인간의 눈이 그렇게 많은 색을 다 구별할 수 없기 때문이다. 

 

부동소수점 형식인 f64be, f64le는 오디오 디테일 정보의 최대치를 제공한다. (하지만 어떤 오디오 시스템이나 우리의 청력이 그 차이점을 잡아낼 수 있을 지는 의문이다.) 부동소수점으로 포맷을 저장하는 것은 꽤나 복잡하지만, 위키피디아에 잘 정리되어 있다. https://en.wikipedia.org/wiki/Double-precision_floating-point_format 

 

따라서 음질 퀄리티를 좌우하는 주된 요인은 비트의 크기이다. (8, 16, 24, 32, 64) 나는 f32와 s32에 큰 차이점이 있다고는 말할 수 없다. 왜냐하면 두 포맷 모두 메모리에서 32비트(4바이트)의 숫자를 차지하기 때문이다. 그래서 실제로 그들은 아마 크게 다르지 않을 것이다. 

 

퀄리티에 있어서 정수 (10)와 부동소수점 (10.0) 의 주된 차이점은 무엇일까? 계속해서 음질과 색상을 비교해보자면 부동소수점 색상표는 모든 색상이 [빨강 : 45, 초록 : 93, 파랑 : 10] 구조가 아니라 [빨강 : 45.384, 초록 : 93.001, 파랑 : 10.23] 등으로 나타낼 수 있을 것이다. 이론적으로 이것은 더 많은 색조(더 자세한 소리)를 제공하지만 실제로는 비트의 깊이 (8, 16, 24, 32, 64비트 등)가 여전히 더 중요한 것 같다.