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


Обзор 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.

  • XAudio2

    Чтобы использовать данные в кодировке ADPCM в XAudio2, необходимо инициализировать структуру ADPCMWAVEFORMAT с определенными значениями ADPCM и передать ее в качестве аргумента IXAudio2::CreateSourceVoice при создании исходного голоса. Пример загрузки и воспроизведения звука в XAudio2 см. в разделе How to: Play a Sound with XAudio2.

КоличествоОбразцовНаБлок

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

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

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

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

 

Ограничения

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

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

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

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

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

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

Фрагмент FCC Описание
РИФФ Стандартный блок 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.

 

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