레이블이 wave file format인 게시물을 표시합니다. 모든 게시물 표시
레이블이 wave file format인 게시물을 표시합니다. 모든 게시물 표시

2010년 2월 26일 금요일

Wave file format

wave file format

offset

size(byte)

field

0

4

"RIFF" or "LIST"

4

4

file size (data size + 40)

8

4

"WAVE"

12

4

"fmr "

16

4

16

20

2

WAVE_FORMAT_PCM

22

2

1 = mono, 2 = strereo

24

4

sample rate

(11kHz: 11025, 22kHz: 22025, 44kHz: 44100)

28

4

bytes per sec

sample rate * channel * (bits per sample/8)

30

2

block align

channel * (bits per sample/8)

32

2

bits per sample (8, 16, ...)

36

4

"data"

40

4

data size


2010년 2월 25일 목요일

Wave file 만들기

winCE에서 winmm.lib를 쓸 수 없는 관계로,, mmio 함수들을 하나도 쓰지 못하고.ㅠㅜ
결국엔 wave file을 손수 만들어 주어야 하는 귀찮음에 봉착하였다.

wave file header 구조에 따라 다음과 같은 구조체를 선언한다.

typedef struct
{
           FOURCC ckID; // 'RIFF'인지 'LIST'인지 넣어준다.
           DWORD dwFileSize; // 전체 file크기 저장 (data크기 + 40)
           FOURCC fccType; // 'WAVE'
           FOURCC subckID; // 'fmr '
           DWORD dwSubChunkSize; // 16
           WORD wFormatTag; // WAVE_FORMAT_PCM
           WORD nChannels; // 1 = mono, 2 = stereo
           DWORD nSamplesPerSec; // 11025, 22050 등등등
           DWORD wBitsPerSample; // 8, 16, 등등등
           WORD nBlockAlign; // nChannels * wBitsPerSample/8
           WORD nAvgBytesPerSec; // nChannels * wBitsPerSample/8 * nSamplesPerSec
           FOURCC datackID; // 'data'
           DWORD dwDataSize; // data크기
} WaveFormChunk;


그리고 이 구조체에 대한 변수를 하나 선언하여 알맞은 값을 넣어주고,
파일의 맨 앞부분에 write한다.

WaveFormChunk WaveHeader;
WaveHeader.ckID = FOURCC_RIFF;
WaveHeader.dwFileSize = m_dwDataLen + 40;
WaveHeader. fccType = MAKEFOURCC('W', 'A', 'V', 'E');
WaveHeader.subckID = MAKEFOURCC('f', 'm', 't', ' ');
WaveHeader.dwSubChunkSize = 16;
WaveHeader. wFormatTag = WAVE_FORMAT_PCM;
WaveHeader. nChannels = 2;//pWaveFormat->nChannels;
WaveHeader. nSamplesPerSec = 11025;//pWaveFormat->nSamplesPerSec;
WaveHeader. wBitsPerSample = 8;//pWaveFormat->wBitsPerSample;
WaveHeader. nBlockAlign = WaveHeader. nChannels * WaveHeader. wBitsPerSample /8;
WaveHeader. nAvgBytesPerSec = WaveHeader. nSamplesPerSec * WaveHeader. nBlockAlign;          
WaveHeader.datackID = MAKEFOURCC('d','a','t','a');
WaveHeader.dwDataSize = m_dwDataLen;

WriteFile(hFile, & WaveHeader, sizeof(WaveFormChunk), &dwSize, NULL);
//파일 입출력 참고 (포스팅보러가기)

그리고 나머지  data를 write하면 wave 파일이 생성된다-_-)/