Обзор 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. |
Связанные разделы