Dela via


ÖVERSIKT ÖVER ADPCM

ADPCM (Adaptive Differential Pulse Code Modulation) är ett förlustigt komprimeringsformat som implementeras för XAudio2 för att tillhandahålla ytterligare funktioner för att ange storleken på komprimeringsexempelblocket. Med ett förlustigt komprimeringsformat ändras och går vissa data förlorade under komprimering. ADPCM kan uppnå komprimeringsförhållanden på upp till 4:1.

Implementeringen av ADPCM för XAudio2 innehåller ytterligare funktioner för att ange storleken på komprimeringsexempelblocket. ADPCM gör det möjligt för ljuddesignern att välja en inställning som är en lämplig kompromiss mellan storlek, kvalitet och upplösning (för att placera looppunkter).

XAudio2 använder en modifierad version av Microsoft ADPCM-codec som stöder den utökade dataformatering som krävs för att tillhandahålla anpassade exempelblockstorlekar. Därför kan XAudio2-ljuddata inte spelas upp av ljudmotorer som inte stöder den här versionen av ADPCM-codec.

Anteckning

För närvarande är ADPCM-komprimering endast tillgängligt för Windows, inklusive XNA Game Studio Express för Windows-distributioner.

 

ADPCM-kodning

Ljuddata kodas till ADPCM med hjälp av kommandoradsverktyget AdpcmEncode.

  • AdpcmEncode

    För att koda ljudfiler som ADPCM för användning med XAudio2 använder du kommandoradsverktyget AdpcmEncode.

ADPCM-avkodning

Avkodning av programvara för ADPCM stöds i XAudio2.

  • XAudio2

    För att kunna använda ADPCM-kodade data i XAudio2 måste du initiera en ADPCMWAVEFORMAT- struktur med ADPCM-specifika värden och skicka den som ett argument för att IXAudio2::CreateSourceVoice när du skapar en källröst. Ett exempel på hur du läser in och spelar upp ett ljud i XAudio2 finns i How to: Play a Sound with XAudio2.

SamplesPerBlock

ADPCM-komprimering fungerar genom att separera vågformen i block och förutsäga variationen av vågformsexemplen i varje block. Storleken på blocken mäts i prover. Den minsta blockstorleken är 32 exempel och den högsta är 512 exempel.

Större block ger bättre komprimering, vilket resulterar i mindre filstorlekar, men på bekostnad av ljudkvalitet och upplösning för att justera looppunkter.

I allmänhet resulterar ändring av värdet SamplesPerBlock i dessa kompromisser:

Om SamplesPerBlock... Filkomprimering Ljudkvalité Looppunktsupplösning
Ökar (upp till max 512) Ökar Minskar Minskar
Minskningar (ned till min 32) Minskar Ökar Ökar

 

Inskränkningar

Eftersom ADPCM använder exempelblock som är justerade efter varandra kan en våg som komprimeras med ADPCM ha ett oavslutat, partiellt block i slutet. ADPCM-avkodaren genererar tystnad för resten av det här partiella blocket, vilket hindrar vågen från att loopa sömlöst.

Värdet för parametern SamplesPerBlock påverkar den upplösning som du kan justera vågdata och looppunkter med.

Om du försöker tillämpa komprimering på en ojusterad våg, får du ett fel eller en varning beroende på om vågen används i några loopande spelsessioner. Du kan inte komprimera en våg som används i några upprepande spelhändelser. Ta bort den från loopningsspelhändelserna och tillämpa komprimering igen.

Om du använder ljudvågen uteslutande utan looping, gäller inte begränsningen för justering av exempelblock.

ADPCM-filstruktur

En ADPCM-fil är en RIFF-standardfil med följande segmenttyper.

Del FCC Beskrivning
RIFF Standard RIFF-segment som innehåller en filtyp med värdet WAVE i de första fyra byteen i dess dataavsnitt och de andra segmenten i filen i resten av dess dataavsnitt.
Fmt Innehåller formatrubriken för ADPCM-filen. Data i det här segmentet motsvarar en ADPCMWAVEFORMAT- datastruktur.
data Innehåller kodade ADPCM-ljuddata. När du använder ADPCM i XAudio2 måste du läsa innehållet i datasegmentet till en buffert och skicka det till en källröst som pAudioData medlem i en XAUDIO2_BUFFER struktur. Du behöver inte byta ut innehållet i datasegmentet.
smpl och wsmp Valfria segmenttyper som innehåller loopinformationen för ADPCM-filen. När du använder ADPCM i XAudio2 används värdena i smpl- eller wsmp-segmenten för att fylla i LoopBeginLoopLength-- och LoopCount-medlemmar i XAUDIO2_BUFFER-strukturen. På Xbox 360 måste du byta ut data som lästs in från ett smpl-segment för att ta hänsyn till endiannessskillnaden mellan Windows och Xbox 360.

 

programmeringsguide