ADPCM 개요

ADPCM(적응 차등 펄스 코드 변조)은 압축 샘플 블록의 크기를 지정하기 위한 추가 기능을 제공하기 위해 XAudio2에 구현되는 손실 압축 형식입니다. 손실 압축 형식을 사용하면 압축하는 동안 일부 데이터가 변경되고 손실됩니다. ADPCM은 최대 4:1의 압축 비율을 달성할 수 있습니다.

XAudio2용 ADPCM 구현은 압축 샘플 블록의 크기를 지정하는 추가 기능을 제공합니다. ADPCM을 사용하면 오디오 디자이너가 크기, 품질 및 해상도 간에 적절한 손상이 되는 설정을 선택할 수 있습니다(루프 지점 배치용).

XAudio2는 사용자 지정 샘플 블록 크기를 제공하는 데 필요한 확장 데이터 서식을 지원하는 수정된 버전의 Microsoft ADPCM 코덱을 사용합니다. 이러한 이유로 XAudio2 오디오 데이터는 이 버전의 ADPCM 코덱을 지원하지 않는 오디오 엔진에서 재생할 수 없습니다.

참고

현재 ADPCM 압축은 Windows용 XNA Game Studio Express 배포를 포함하여 Windows에서만 사용할 수 있습니다.

 

ADPCM 인코딩

오디오 데이터는 AdpcmEncode 명령줄 도구를 사용하여 ADPCM에 인코딩됩니다.

  • AdpcmEncode

    오디오 파일을 XAudio2와 함께 사용하기 위해 ADPCM으로 인코딩하려면 AdpcmEncode 명령줄 도구를 사용합니다.

ADPCM 디코딩

ADPCM의 소프트웨어 디코딩은 XAudio2에서 지원됩니다.

SamplesPerBlock

ADPCM 압축은 파형을 블록으로 분리하고 각 블록 내에서 파형 샘플의 변형을 예측하여 작동합니다. 블록의 크기는 샘플로 측정됩니다. 가장 작은 블록 크기는 32개의 샘플이며 가장 높은 샘플은 512개 샘플입니다.

블록이 클수록 압축이 향상되어 파일 크기가 작아지지만 사운드 품질과 해상도를 희생하여 루프 포인트를 정렬할 수 있습니다.

일반적으로 SamplesPerBlock 값을 수정하면 다음과 같은 절충이 발생합니다.

SamplesPerBlock인 경우... 파일 압축 음질 루프 지점 확인
증가(최대 512까지) 증가 감소 감소
감소(최소 32까지) 감소 증가 증가

 

제한

ADPCM은 서로 정렬된 샘플 블록을 사용하므로 ADPCM으로 압축된 웨이브의 끝에 미완성 부분 블록이 있을 수 있습니다. ADPCM 디코더는 이 부분 블록의 나머지 부분에 대해 침묵을 생성하여 웨이브가 원활하게 반복되지 않도록 합니다.

SamplesPerBlock 매개 변수의 값은 웨이브 데이터 및 루프 지점을 맞출 수 있는 해상도에 영향을 줍니다.

정렬되지 않은 웨이브에 압축을 적용하려고 하면 웨이브가 루핑 플레이 이벤트에서 사용되는지 여부에 따라 오류 또는 경고가 발생합니다. 루핑 플레이 이벤트에 사용되는 웨이브는 압축할 수 없습니다. 반복 재생 이벤트에서 제거하고 압축을 다시 적용합니다.

비루핑 모드에서만 웨이브를 사용하는 경우 샘플 블록 맞춤 제한이 적용되지 않습니다.

ADPCM 파일 구조

ADPCM 파일은 다음 청크 형식의 표준 RIFF 파일입니다.

청크 FCC 설명
RIFF 데이터 섹션의 처음 4바이트에서 WAVE 값이 있는 파일 형식과 나머지 데이터 섹션에 있는 파일의 다른 청크를 포함하는 표준 RIFF 청크입니다.
Fmt ADPCM 파일의 형식 헤더를 포함합니다. 이 청크의 데이터는 ADPCMWAVEFORMAT 구조체에 해당합니다.
데이터 인코딩된 ADPCM 오디오 데이터를 포함합니다. XAudio2에서 ADPCM을 사용하는 경우 데이터 청크의 내용을 버퍼로 읽고 원본 음성에 XAUDIO2_BUFFER 구조의 pAudioData 멤버로 전달해야 합니다. 데이터 청크의 내용을 바이트 교환할 필요가 없습니다.
smpl 및 wsmp ADPCM 파일에 대한 루핑 정보를 포함하는 선택적 청크 형식입니다. XAudio2에서 ADPCM을 사용하는 경우 smpl 또는 wsmp 청크에 포함된 값은 XAUDIO2_BUFFER 구조체의 LoopBeginLoopLengthLoopCount 멤버를 채우는 데 사용됩니다. Xbox 360에서는 smpl 청크에서 로드된 데이터를 바이트 교환하여 Windows와 Xbox 360 간의 엔디언스 차이를 고려해야 합니다.

 

프로그래밍 가이드