통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34007 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 [API] 저수준 제어를 이용한 WAVE 재생 - 01 [시작]  | Sound 2002-06-12 오후 1:51:46
 lovesgh  lovesgh님께 메시지 보내기lovesgh님을 내 주소록에 추가합니다.lovesgh님의 개인게시판 가기 번호: 4376  / 읽음:10,165

 ------------------------------------------------------------------

 안녕하십니까? 매일 같이 데브피아에는 놀러오는데, 마땅히 답변해 줄

실력도 안되고, 늘 구경만 하다가 이번에 강좌?랍시고 글 하나  쓰기로

했습니다. 비록 없는 실력이긴 하지만, 열심히 쓰겠습니다.

 

 강좌는 윈도우즈 API 를 이용한 Media( 그 중에서 먼저 WAVE 방식부터

시작 하겠습니다. ) 재생에 관한 내용입니다. API 를 이용한 Media재생

에는 크게 고수준제어와 저수준제어로 나뉘는데, MCI_계열 함수를 이용

한 고수준 제어로는 간단하게 충분한? 성능의 미디어 재생기를 제작 할

수 있지만, 보다 더 세심하고 세밀하게 제어를 원한다면 역시 저수준제

어로 갈 수 밖에 없습니다. WAVE 파일의 임의 영역 삭제라던지, 복사하

기 또는 변형(에쿄 효과 내지는 화이트 노이즈..  그 밖의 여러가지 이

펙트..)과 같은 작업을 위해서는 저수준 제어로 가는 것이 아마도.....

무병장수하는 지름길이 아닐까..합니다.본 강좌는 특정 언어 형식에 구

애 받지 않고 진행하려 했으나!.. 부득이 하게 C 를 이용하여 진행합니

다. ( 할줄 아는게.. ) API 관련 부분은 API 를 이용할 수 있는 어떠한

언어로도 작업이 가능하기 때문에 (비주얼 베이직, 델파이 , C++ 빌더,

그 밖에.. ) 다른 언어를 하고 계신 분이라도 쉽게 적용하실 수 있을겁

니다.

 

 끝으로.. 아직 미숙한 실력으로 그래도 뭔가 도움이 될까 하고 쓰기는

쓰는데, 틀린 부분도 있을 것 이고 어색한 부분도 있을 것입니다. 부탁

드리는 것은  100% 믿지 말고 실제로 작성해 가면서 자신이 느껴보라는

것입니다. 그리고, 잘못된 용어사용에 대한 지적을 해 주신 '고임'님과

데브피아 게시판의 기능을 잘 몰라 편집도 제대로 못하고 있는 저를 위

해 게시판 정리를 해 주신 담당자님께 감사드립니다.

 

------------------------------------------------------------------

 

[WAVE FILE의 구조]

 

 WAVE 파일은 사운드 파일중에 한 형식으로 윈도우에서 가장 흔하게 쓰

이는 파일중에 하나이다. 이번에 이 유령넘이 강좌?랍시고 주절 거리는

내용은 이넘의 WAVE 파일을 한번 재생해 보자..는 것이다. WAVE 파일을

재생하는데는, 쉽게는 SoundPlay() 함수였던가? .. 한줄이면 족하다...

물론, 지금 이 강좌는 그렇게 한줄이면 끝나는 정도가 아닌, WAVE 파일

의 밑바닥부터 꼭대기까지 샅샅히 훑어 내려가며, 그 내부를 마구 파헤

쳐 WAVE 파일을 맘대로 주무를 수 있도록 하는 경지?에까지 도달하도록

하는것이 목표다.

 

 일단, WAVE 파일이고 머고 간에, 기본적인 공식?부터 알아보고 넘어가

도록 하자.사운드라는 것에 대해 깊이 있는 지식을 가지고 있는 사람은

볼 필요가 없겠지만, 어디까지나 처음 시작하는 사람들이 볼 것 이라고

가정하고 설명하도록 한다.

 

 WAVE 파일을 재생하면서 가끔 등록정보를 보신 분들은 알겠지만, 대게

WAVE 파일의 등록정보라고 하면, 16 Bit , Stereo , 44.1 kHz...  등등

의 정보가 보일것이다. 이게 뭐가 중요하냐고? 중요하다.. 정말 중요하

다. 이것으로 WAVE 파일이 시작되는 것이기 때문이다.예를 들어서 다음

과 같은 WAVE 파일이 하나 있다고 보자.

 

------------------------------------------------------------------

 [어떤 WAVE 파일의 등록정보]

 

 - 곡명 : 교장선생님이라 불러라!

 - 16 Bit

 - Stereo

 - 44.1 khz

------------------------------------------------------------------

 

 이 세가지 정보면 WAVE 파일의 모든 것?을 알 수 있다. 일단 이 3가지

기본적인 정보만으로 이 WAVE 파일의 초당전송량(Bit/Second)이나,전체

재생시간등을 계산해 보자. (이거 배워두면 정말 좋다..-_-;;..그냥..)

 

 일단 계산하는 방식은 모두 곱한다. 16 Bit 이므로 16 을 곱하고,스테

레오 방식이기 때문에 (스테레오는 채널이 2개 이기때문에, 2를 곱한다

당연히 모노는 1채널이기 때문에 1을 곱하면 된다.... 1은 안곱해도 되

는구나 --;) 그리고 44.1 kHz 라는 것은 1초에 44100 번 발광을 한다는

소리니까 44100을 곱하면 된다.

 

16 * 2 * 44100 = 1411200 Bit 다.. 다시 바이트로 고쳐주려면, 나누기

8을 하면 된다. (왜 나누기 8을 하냐고 묻는다면.. 아시다시피.. 8 Bit

는 1 Byte 이기 때문이다..) 나누기 8을 한 결과 176400 이라는 숫자가

나왔다.

 

 즉, 이 WAVE 파일은 초당 176400 Byte 의 용량을 전송한다는 얘기다..

숫자가 너무 크다고?.. 다시 KByte로 환산해 보자.. 172.265625가 나오

는데,귀찮으니까 소수점 아랫것들은 잘라버리고 정수부분만 읽어보자면

172 KB 라고 나올 것이다. 그렇다. 이 WAVE 파일은 1초에 172 KB 나 차

지한다. (더럽게 크구만..) 전체 재생시간을 구하는 것 역시 간단하다.

단순히 나누기만 하면 되기 때문이다.  전체 파일 크기를 알고 있다면,

 

 " 전체 파일 크기 / 초당 용량 = 전체 재생 시간 (초 단위) "

 

 라는 공식이 성립되는 것이다.자,이제 자신의 컴퓨터에 들어있는 WAVE

넘들을 모조리 불러다가 그 넘들의 재생시간을 구해보고 실제로 플레이

해본다음 비슷하게 맞는지 비교해 보라.

 

------------------------------------------------------------------

 여기서, 숙제.. 다음의 WAVE 파일들의 전체 크기는 얼마나 될까??????

 

 [1]  8 Bit , Mono , 22 kHz

 [2] 16 Bit , Mono , 11 kHz

 [3] 16 Bit , Stereo , 22 KHz

 

 각각의 WAVE 파일들의 재생시간은 총 1분 30초씩 이다. 그렇다면 각각

의 WAVE 파일들의 전체 파일크기는 얼마나 될까?? ( 대한민국 초등교육

과정을 이수한 사람이라면 누구나 풀 수 있는 문제라서 풀이는 생략..)

------------------------------------------------------------------

 

 WAVE 파일은 대게 8 Bit , 16 Bit 가 많이 쓰이는데, 24, 32 Bit 파일

은 별도로 치고.. 대표적인 8 / 16 Bit 파일들은 아래의 그림처럼 파일

에 저장되어 있다. 8 Bit 라면 - 1 Byte 이므로 1 Byte 단위 마다 저장

되어 있고, 16 Bit 라면 당연히 2 Byte 마다 저장되어 있다. 아래 그림

을 보면 8 Bit 파일은 전부 16개 (16진수 10까지..) 로 되어 있는 반면

16 Bit 는 같은 크기인데도 8 칸 밖에는 안된다. 이론적으로 16 Bit 는

8 Bit 에 비해 2 배의 용량을 차지하기 때문이다. [ D ] 라고 표기되어

있는 것은 본인이 편의상 구분하기 쉽게 [ DATA ] 를 줄여 표현한 것이

고.. ( Mono 는 L / R 구분이 없다 ) Stereo에서 [ L ] , [ R ] 이라고

표기 한 것은 양 채널 ( Left Channel, Right Channel ) 을 뜻 한다...

 

------------------------------------------------------------------

 [ 8 Bit Mono ]

 

   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F  10

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 : D : D : D : D : D : D : D : D : D : D : D : D : D : D : D : D :

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 

 [ 8 Bit Stereo ]

 

   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F  10

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 : L : R : L : R : L : R : L : R : L : R : L : R : L : R : L : R :

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 

 

 [ 16Bit Mono ]

 

     1       2       3       4       5       6       7       8

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 :   D   :   D   :   D   :   D   :   D   :   D   :   D   :   D   :

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 

 [16Bit Stereo ]

 

     1       2       3       4       5       6       7       8

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 :   L   :   R   :   L   :   R   :   L   :   R   :   L   :   R   :

 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 

------------------------------------------------------------------

 

 이건 어디까지나 2 채널(Stereo)방식만을 봤을때 그렇다는 것이고, 채

널이 많아지면 또 저장구조는 당연히 달라지게 된다. 요즘 흔히 말하는

5.1채널이니 7.1채널이니 하는 것들은, 저것과는 모양새가 또 다르다..

 

------------------------------------------------------------------

 

 WAVE 파일에 대해서 간략하게나마 알아봤는데,이제부터는 정말 자세히

파헤쳐 볼 시간이다. WAVE 파일들은 크게 청크 부분과 데이타 부분으로

나뉜다. 실제 사운드가 들어있는 데이타 부분 앞에는 헤더 청크 부분이

있는데, WAVE 파일의 구조를 살펴보면 아래와 같다.

 

------------------------------------------------------------------

1. Wave 파일 포맷(I)

 

   1) PCMWAVEFORMAT 구조체의 구조

      -. WAVEFORMAT wf;

      -. WORD       wBitsPerSample;

 

   2) WAVEFORMAT 구조체의 구조

      -. WORD   wFormatTag;

      -. WORD   nChannels;

      -. DWORD  nSamplesPerSec;

      -. DWORD  nAvgBytesPerSec;

      -. WORD   nBlockAlign;

 

   3) 예 : 22kHz 샘플링된 8bit 스테레오 Wave 파일의 구조

 

      PCMWAVEFORMAT PcmWaveFormat;

      

      PcmWaveFormat.wf.wFormatTag = 1;

      PcmWaveFormat.wf.nChannels = 2;       

      PcmWaveFormat.wf.nSamplesPerSec = 22050;  

      PcmWaveFormat.wf.nAvgBytesPerSec = 44100;

      PcmWaveFormat.wf.nBlockAlign = 2;

      PcmWaveFormat.wBitsPerSample = 8;        

 

 

2. Wave 파일 포맷(II)

------------------------------------------------------------------

     데이터형 Byte  내용            의미

------------------------------------------------------------------

 

 1) RIFF chunk  

     - Char   4   "RIFF"          파일의 종류가 RIFF 파일을 의미

     - DWORD  4   FILE SIZE       현재부터 끝까지의 파일크기

                                  (파일크기-4Byte 또는, 데이터 크기

                                   +40Byte)

     - Char   4   "WAVE"          Wave 파일을 의미

   

 2) FMT sub-chunk

     - Char   4   "fmt "          FMT sub-chunk의 시작

     - DWORD  4   16              현재 포인터(16 Byte)

     - short  2   wFormatTag      PCMWAVEFORMAT의 값

                                  ( 1:Wave Format이 PCM 방식 )

     - short  2   nChannels       채널 수 ( 1:모노, 2:스테레오 )

     - DWORD  4   nSamplesPerSec  샘플링 수

                                  ( 11kHz:11025,

                                    22kHz:22050,

                                    44kHz:44100 )

     - DWORD  4   nAvgBytesperSec 초당 샘플바이트

                                  ( nSamplesPerSec*BlockAlign )

     - short  2   BlockAlign      샘플당 바이트( nChannels*비트/8 )

     - short  2   wBitsPerSample  샘플당 비트수

 

   3) Data sub-chunk

     - Char   4   "data"          데이터청크의 시작

     - DWORD  4   DATA SIZE       데이터의 크기

                  DATA            데이터

------------------------------------------------------------------

 

 WAVE 파일들을 EDITOR 로 읽어보면 파일의 내용이 아래와 같이 나온다

원래는 HEX 값이 나와야 하는데 메모장으로 읽어들였더니..아래처럼 나

왔다.. -_-; 그래도 상관없다. 중요한건 제일 처음 " RIFF " 라는 단어

로 시작한다는 것이다. 그 다음에 WAVE 파일 포맷임을 알리는 " WAVE "

라는 단어가 온다. 보통 파일포맷에 따라 헤더에 해당 파일포맷임을 알

리는 식별자가 오는데 GIF나 PCX, 또는 EXE 파일들을 한번씩 열어 보면

같은 단어로 시작한다는 것을 알 수 있을 것이다.

 

[1] RIFF$?WAVEfmt    D쵆X   data? ...

 

[2] RIFF?$WAVEfmt    D??  data? ...

 

[3] RIFF?  WAVEfmt         D   ?     PAD ?                                                                                  

------------------------------------------------------------------                                   

 3 개의 WAVE 파일들을 열어봤는데, 모두 RIFF .. WAVE .. fmt 로 시작

하고 있다.이 파일들이 WAVE 파일임을 알 수 있는 것이다. 사실 WAVE파

일에도 ADPCM 이니 PCM 이니 하는 식으로 다양한?포맷이 존재하는데 이

것은 쉽게 생각하면 압축방식의 차이다.  여기서 RIFF 파일 형식이라는

말이 나오는데, RIFF에 대해서 설명하자면..

           

------------------------------------------------------------------

[ RIFF 파일(Resource Interchange File Format) ]

------------------------------------------------------------------  

음성이나 비디오 같은 유의 데이터들은 용량이 매우 크기 때문에  이를

저장할 시에는 비트 단위보다는 블록 단위로 저장을 하게 된다. 이러한

블록은 가변적인 크기를 가질 수 있는데 이를 위해서는 데이터 블록 앞

에 헤더를 사용해 이를 정의해 주어야 한다. 일례로 10 MByte 의  음성

데이터를 파일에 저장 하려할 때 블록 단위로 하지 않으면 데이터를 불

러오는데 10M의 메모리가 필요하게 된다. 이렇게 된다면 불러오기도 힘

들 뿐만 아니라 불러오는데 걸리는 시간이 많이 걸리는 단점이 생긴다.

그러나 10M의 음성데이터를 0.5M 씩 블록으로 나누어 저장한다면 20 개

의 블록을 가질 것이다. 즉, 0.5M씩 메모리에 불러온 후 출력하고,  메

모리를 해제한 후 다시 다음 블록을 불러오면 그만큼 메모리도 절약 할

수 있어 매우 편리하게 된다. 또한 데이터 저장 블록 앞에 블록의 데이

터 크기를 넣어주는데, 이는 예를 들자면 어느 시간동안 모노로 듣다가

후에 스테레오로 들을 수 있는 상황 등에 대처하기 쉽다. 이럴 때 데이

터 블록 앞에 데이터에 대한 정보를 만들어 준다. 각각의 부분 하나 하

나는 청크(Chunk)라고 하고 처음에 나오는 상자를 부모 청크,그 하단에

위치하는 부분을 자식 청크, 데이터들은 데이터 청크라고 한다.이와 같

은 구성 데이터를 저장하는 방식을 RIFF라 하고 위와 같은 구성으로 저

장된 데이터를 RIFF 파일이라 한다.  WAVE  파일이나 AVI  파일이 바로

RIFF 파일이다.

------------------------------------------------------------------    

 

 다음으로 알아두면 앞으로 강좌를 이해하기에 좋을 압축방식들에 대한

정보들을 소개한다.

 

[ PCM(Pulse Code Modulation) 방식 ]

 

이 방식은 가장 널리 사용되는 방식으로서 음성을 아날로그에서 디지털

로 변환하여 양자화(작은 단위화)한 데이터를 그대로 저장한 후 재생할

때에는 그 데이터를 디지털에서 아날로그로 재변환하여 음성 파형을 만

든다. 이 방식은 양자화를 할 때 생기는 오차가 존재하지만 재생 시 상

당히 우수한 품질을 가진다.이 방식의 특징은 제로 크로스의 방법에 비

해 생성되는 데이터의 양이 많다는 점이다.예를 들어, 샘플링 주파수를

8Khz로 하고 양자화 시 정밀도를 8bit로 하면 8000 * 8 = 64000/sec =

64Kbit/sec로 초당 64KB가 생성된다. 그러나 최근에는 메모리의 가격이

많이 떨어지고 있어서 뛰어난 음성 품질을 보장할수 있는 PCM방식을 많

이 사용하고 있다.

 

 

[ DM(Delta Modulation) 방식 ]

 

DM 방식은 제로 크로스 방식과 PCM 방식의 중간적인 형태로 볼 수 있다

이 방식은 어느 시점n의 파고와 바로 전 시점 (n-1)의 파고를 비교하여

그 차이점을 1,0,-1로 표현한다. DM 방식의 단점은 원파형의 급격한 변

화를 따라가지 못한다는 것이다. DM 방식의 하드웨어 구현은 바로 이전

값에 1 또는 -1을 더하기만 하면 되므로 아주 간단하다.

 

 

[ DPCM(Differencial PCM) 방식 ]

 

우리의 음성 파형을 실제로 보면, 서로 인접한 샘플링 시점의 비교에서

파형이 크게 변하지 않는다. 이점에 착안하여 만든 방식이 DPCM 방식이

다. DPCM 방식은 개선된 PCM 방식이라 할 수 있다. 즉,  PCM 방식은 파

고 값을 그대로 저장하지만 DPCM  방식은 이전의 값과의 차이만을 저장

하는 것이다.  음성의 파형이 크게 변하지 않으므로 차이값도 작아져서

bit-rate를 낮출 수 있다.

 

[ ADPCM(Adaptive Differencial PCM) 방식 ]

 

ADPCM 방식은 위의 여러 가지 방식의 단점을 보완한 것이다. DM 방식이

나 DPCM 방식은 압축된 비트수로 표현 되는 최대의 변화량이 실제 파형

의 변화량보다 작기 때문에 실제로 구현하면 재생 파형이 원 파형의 급

격한 변화를 나타내지 못한다. 이를 막기 위하여 양자화할때 시간 간격

을 작게 하면 bit-rate를 증가시키는 결과를 가져오게 된다.ADPCM 방식

은 파형의 변화량이 급격히 변할 때는 양자화 할 때의 단위를 크게하여

차분값을 이용하는 것으로 파형의 진폭이 클경우 약간의 잡음이 있어도

사람이 잘 감지하지 못하는 점을 이용한 것이다.

 

------------------------------------------------------------------

 

 

------------------------------------------------------------------

 이상으로 첫번째 강좌?를 마치겠습니다. 틀린부분이 있으면,저의 개인

이메일 주소( lovesgh@empal.com )로 메일 주세요(스팸은 제발..싫어!)

첫번째 강좌?에서는 간단하게 여러가지 WAVE 파일 포맷과 또 파일 구조

등에 대해서 알아봤는데, 이것 들은 앞으로 미디어 재생기를 제작 할때

꼭 필요한 이론적 배경지식이 되므로 꼭 숙지?하셔야 합니다.두번째 강

좌?에서는 이제 실제로 WAVE 파일들을 불러다가 그 내부 정보를 파헤쳐

보는 시간을 갖도록 하겠습니다..

------------------------------------------------------------------

 

코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.