2024년 9월 3일 화요일

wav 파일 확장자

 

사운드 확장자 파일들 mp3 wav flac등 여러가지가 있는데

그 중에 wav 파일을 조금 정리해보려고 한다



오디오에 관하여 전문가는 아니지만 쓰기 위해서

최소한의 공부는 해두고 가야할 것 같기 때문



WAVE 파일 형식은 컴퓨터에 오디오 비트스트림을 저장하기 위한

오디오 파일 형식이다.



PCM(Pulse-code Modulation) 방식

아날로그 사운드를 디지털 방식으로 변환하기 위한 방법 



wav 는 mp3 와 달리 압축 없는 원본 사운드 파일이며

고로 High Fidelity 오디오 데이터이다 - 손실이 거의 없다는 뜻



오디오의 확장자, 데이터, 채널 수...등 여러 요소들을 저장하고 읽기 위해

청크 단위로 나눠서 저장함




그 청크 데이터의 첫번째 요소

RIFF는 Resource Interchange File Format 

오디오 확장자 및 파일 크기를 나타내는 부분임


4 4 4 바이트로 ID는 "RIFF" 아스키 값이 저장

FileSize(ChunkSize)는 전체 파일 크기에서 8바이트를 뺀 값이며


그리고 FileFormatID(Format)은 wav 확장자를 의미하는 "WAVE"가 저장되어 있음 

똑같이 ASCII 형




다음은 fmt 청크로 얘는 오디오 데이터 포맷을 설명함

첫번째 값은 ID로 "fmt" 아스키를 저장


두번째는 fmt 청크의 크기를 나타내는데 ID와 

fmt ChunkSize를 제외한 나머지 크기를 의미함 - 16바이트


AudioFormat은 PCM 의 경우 1이 저장


NumChannels 는 채널 개수,

모노는 채널수가 하나인 좌우 개념 없는 사운드고

스테레오는 좌우 음향, 사플 대충 그런 느낌 - 채널 두개


Frequence(SampleRate) - 초당 행하는 샘플링 횟수

보통 44100 Hz (44.1 kHz) 임


ByteRate(BytePerSec) - 초당 비트전송률

(샘플 레이트 x 채널 갯수 x 샘플 당 비트수) 로 구할 수 있음

여기에 8로 나누어 바이트로 변환하면 실제 저장된 값이 나옴

ex) 44.1kHz * 2(stereo) * 16bit = 1411.2 kbps



오디오 속성 들가면 나와있음


BlockAlign(BytePerBlock) - 블럭 당 바이트 수

(채널 갯수 x 샘플 당 비트 수) / 8


BitsPerSample - 각 샘플 당 비트 수

8비트 16비트 등이 있음



마지막 청크로 Data 청크는

ID "data" ASCII

DataSize - (샘플 갯수 x 채널 갯수 x 샘플 당 비트 수) / 8

SampledData - N 바이트


이렇게 실제 오디오 데이터 관련해서 저장됨



이게 바이트가 저장되는 순서는 또 다르다


Identifier 는 ASCII라 1 2 3 4 이렇게 순서대로 저장

나머지는 0인 비트가 자주 있어서 인지 모르겠는데

4 3 2 1 거꾸로 저장됨

이는 Big Endian 과 Little Endian 이라 한다


예를 들어 RIFF 청크에 이런 데이터가 있다고 치면



ID "RIFF"와 뒷부분 포맷 "WAVE" 는 Big Endian이라 순서대로 저장되는데 

가운데는 Little로 거꾸로니까 실제로 읽을때는

00 00 08 24 가 된다.

이는 10진수로 2084이므로 실제 파일 사이즈는 2084 + 8 인

2 KB (2092 byte) 가 된다. /1024


참고 사이트 : WAV - 위키백과, 우리 모두의 백과사전 (wikipedia.org)



 

댓글 없음:

댓글 쓰기

c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...