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


Службы формата файлов обмена ресурсами

Предпочтительный формат для мультимедийных файлов — формат файлов обмена ресурсами (RIFF). Функции ввода-вывода RIFF-файлов работают с базовыми буферизованными и небуферизованными службами файлового ввода-вывода. Вы можете открывать, читать и записывать RIFF-файлы так же, как и другие типы файлов. Подробные сведения о RIFF см. в разделе Функции и макросы AVIFile.

RIFF-файлы используют четыре символьных кода для идентификации элементов файла. Эти коды представляют собой 32-разрядные величины, представляющие последовательность из одного-четырех буквенно-цифровых символов ASCII, заполненных справа пробелами. Тип данных для четырехсимвого кода — FOURCC. Используйте макрос mmioFOURCC для преобразования четырех символов в четырехзначный код. Чтобы преобразовать строку, завершающуюся значением NULL, в четырехзначный код, используйте функцию mmioStringToFOURCC .

Базовым стандартным блоком RIFF-файла является блок. Блок — это логическая единица мультимедийных данных, например один кадр в видеоклипе. Каждый блок содержит следующие поля:

  • Код из четырех символов, указывающий идентификатор блока.
  • Значение doubleword, указывающее размер элемента данных в блоке
  • Поле данных

На следующем рисунке показан фрагмент RIFF, содержащий два вложенных фрагмента.

фрагмент riff, содержащий два вложенных фрагмента изображения

Блок, содержащийся в другом фрагменте, является вложенным фрагментом. Единственные блоки, которые могут содержать вложенные фрагменты, — это блоки с идентификатором "RIFF" или "LIST". Блок, содержащий другой блок, называется родительским. Первый фрагмент в RIFF-файле должен быть "RIFF". Все остальные фрагменты в файле являются подчанками блока RIFF.

Блоки RIFF включают дополнительное поле в первые четыре байта поля данных. Это дополнительное поле предоставляет тип формы поля. Тип формы — это код из четырех символов, определяющий формат данных, хранящихся в файле. Например, файлы Microsoft Waveform-audio имеют тип формы "WAVE".

Блоки LIST также включают дополнительное поле в первые четыре байта поля данных. Это дополнительное поле содержит тип списка поля. Тип списка представляет собой четырехзначный код, определяющий содержимое списка. Например, блок "LIST" с типом списка "INFO" может содержать блоки "ICOP" и "ICRD", предоставляющие сведения об авторских правах и дате создания. На следующем рисунке показан фрагмент RIFF, содержащий блок LIST и еще один подпанк (блок LIST содержит два вложенных фрагмента).

фрагмент riff, содержащий изображение фрагмента списка

Службы ввода-вывода мультимедийных файлов включают две функции, которые можно использовать для перемещения между фрагментами в RIFF-файле: mmioAscend и mmioDescend. Эти функции можно использовать как высокоуровневые функции поиска. При спуске на блок положение файла устанавливается в поле данных блока (8 байт от начала блока). Для блоков RIFF и LIST расположение файла устанавливается в расположение после типа формы или типа списка (12 байт от начала блока). При выходе из блока позиция файла устанавливается в расположение после конца блока.

Чтобы создать новый блок, используйте функцию mmioCreateChunk для записи заголовка блока в текущей позиции в открытом файле. Функции mmioAscend, mmioDescend и mmioCreateChunk используют структуру MMCKINFO для указания и извлечения сведений о блоках RIFF.