Поделиться через


Обзор ADPCM

Адаптивная дифференциальная импульсная модуляция (ADPCM) — это формат сжатия с потерями, реализованный для XAudio2 для предоставления дополнительных возможностей для указания размера блока образца сжатия. При использовании формата сжатия с потерями некоторые данные изменяются и теряются во время сжатия. ADPCM может достичь коэффициента сжатия до 4:1.

Реализация ADPCM для XAudio2 предоставляет дополнительные возможности для указания размера примера блока сжатия. ADPCM позволяет конструктору звука выбрать параметр, который является подходящим компромиссом между размером, качеством и разрешением (для размещения точек цикла).

XAudio2 использует измененную версию кодека Microsoft ADPCM, которая поддерживает расширенное форматирование данных, необходимое для предоставления пользовательских размеров блоков выборки. По этой причине звуковые данные XAudio2 не могут воспроизводиться звуковыми подсистемами, которые не поддерживают эту версию кодека ADPCM.

Примечание

В настоящее время сжатие ADPCM доступно только для Windows, включая XNA Game Studio Express для развертываний Windows.

 

Кодировка ADPCM

Звуковые данные кодируются в ADPCM с помощью программы командной строки AdpcmEncode.

  • AdpcmEncode

    Чтобы кодировать звуковые файлы как ADPCM для использования с XAudio2, используйте программу командной строки AdpcmEncode .

Декодирование ADPCM

Программное декодирование ADPCM поддерживается в XAudio2.

SamplesPerBlock

Сжатие ADPCM выполняется путем разделения формы волны на блоки и прогнозирования вариантов выборок форм волн в каждом блоке. Размер блоков измеряется в образцах. Самый маленький размер блока — 32 образца, а самый высокий — 512 выборок.

Большие блоки обеспечивают лучшее сжатие, что приводит к меньшим размерам файлов, но за счет качества звука и разрешения для выравнивания точек цикла.

Как правило, изменение значения SamplesPerBlock приводит к следующим компромиссам:

Если SamplesPerBlock... Сжатие файлов Качество звука Разрешение точки цикла
Увеличивается (до 512) Увеличивает Уменьшается Уменьшается
Уменьшается (до минимума 32) Уменьшается Увеличивает Увеличивает

 

Ограничения

Так как ADPCM использует примеры блоков, которые выровнены друг за другом, волна, сжатая с помощью ADPCM, может иметь незавершенный, частичный блок в конце. Декодер ADPCM создает тишину для оставшейся части этого частичного блока, что не позволяет волне легко зацикливание.

Значение параметра SamplesPerBlock влияет на разрешение, с которым можно выровнять данные волн и точки цикла.

При попытке применить сжатие к волне, не выровненной, вы получите ошибку или предупреждение в зависимости от того, используется ли волна в любых событиях воспроизведения цикла. Вы не можете сжать волну, используемую в каких-либо событиях воспроизведения цикла. Удалите его из событий циклического воспроизведения и повторно примените сжатие.

Если вы используете волну исключительно в нецикловом режиме, ограничение на выравнивание блоков выборки не применяется.

Структура файлов ADPCM

ADPCM-файл — это стандартный RIFF-файл со следующими типами блоков.

Фрагмент FCC Описание
RIFF Стандартный фрагмент RIFF, содержащий тип файла со значением WAVE в первых четырех байтах раздела данных, а другие блоки в файле в оставшейся части раздела данных.
Fmt Содержит заголовок формата для ADPCM-файла. Данные в этом блоке соответствуют структуре ADPCMWAVEFORMAT .
. Содержит закодированные аудиоданные ADPCM. При использовании ADPCM в XAudio2 необходимо считывать содержимое блока данных в буфер и передавать его в исходный голос в качестве элемента pAudioDataструктуры XAUDIO2_BUFFER . Вам не нужно менять содержимое блока данных в байтах.
smpl и wsmp Необязательные типы блоков, содержащие сведения о цикле для файла ADPCM. При использовании ADPCM в XAudio2 значения, содержащиеся в блоках smpl или wsmp, используются для заполнения элементов LoopBeginLoopLength и LoopCount структуры XAUDIO2_BUFFER . На Консоли Xbox 360 необходимо заменить байтами данные, загруженные из фрагмента smpl, чтобы учесть разницу в конечности между Windows и Xbox 360.

 

Руководство по программированию