RIFF (англ. Resource Interchange File Format) — один з форматів файлів-контейнерів для збереження потокових даних.

Найчастіше використовується для збереження потокових мультимедіа-даних (відео, аудіо, можливо текст).

Найвідоміші формати, які використовують RIFF як контейнер: AVI (відео), WAV (аудіо), RMI (MIDI-треки).

Формат RIFF використовує little-endian порядок байтів (молодший байт іде першим). Для машин з форматом даних big-endian існує формат RIFX, але через дуже слабку популярність машин з таким форматом даних, RIFX не прижився, і в сучасності RIFF використовується також і на машинах з big-endian порядком байтів.

RIFF формати файлів ред.

RIFF формати забезпечують можливість зберігати велике різноманіття даних, таких як зображення, аудіо записи, відео, і інформацію необхідну для налаштування периферичних пристроїв. Тип даних, які записані у RIFF файлі визначається розширенням файлу. Приклади видів даних, які можуть бути записані у RIFF файлі:

  • аудіо/відео дані (.AVI)
  • аудіо дані (.WAV)
  • дані растрових зображень (.RDI)
  • MIDI інформація (.RMI)
  • Палітра кольорів (.PAL)
  • Мультимедійний фільм (.RMN)
  • Анімований курсор (.ANI)
  • Набір інших RIFF файлів (.BND)

На сьогодні, AVI формат єдиний з усіх типів RIFF файлів, який повністю реалізований з виконанням актуальної специфікації RIFF. Хоча WAV файли також мають повну реалізацію, розробники зазвичай використовують більш просту і давню специфікацію при записі файлів.

Структура RIFF файлу ред.

RIFF це бінарний формат файлу, який містить декілька пов'язаних структур даних. Такі структури даних, з яких складається RIFF файл, називаються секціями. Секції не мають фіксованої позиції у файлі, тому ніякі фіксовані зміщення не можна використати для того, щоб визначити позицію полів. Секція, яка містить в собі такі дані як структуру даних, масив бінарних даних, чи іншу секцію, називається підсекцією. Кожна секція у RIFF файлі має відповідну базову структуру:

typedef struct _Chunk
{
    DWORD ChunkId;              /* Ідентифікатор секції */
    DWORD ChunkSize;            /* Розмір даних секції у байтах */
    BYTE ChunkData[ChunkSize];  /* Дані секції */
} CHUNK;
  • ChunkId складається з 4-ох ASCII символів, які є ідентифікатором даних, що містяться у секції. Наприклад, ідентифікатор RIFF використовується для позначення секції яка містить RIFF дані. Якщо ідентифікатор менше чотирьох символів він доповнюється символами пробілу справа (ASCII 32). RIFF файли записуються у little-endian порядку байт. Файли, які записуються за схемою big-endian мають ідентифікатор RIFX.
  • ChunkSize — розмір даних записаних у полі ChunkData, не включаючи вирівнювання яке можуть мати дані. Розмір полей ChunkId і ChunkSize не включається в сумарний розмір даних.
  • ChunkData містить дані з вирівнюванням по словам при записі RIFF файлу. Якщо дані мають не парний розмір в кінець даних дописують додатковий байт NULL.

Підсекції також мають таку саму структуру як і секції. Допустимі секції, які можуть містити підсекції це секція RIFF і секція яка містить список LIST. Інші секції можуть містити лише дані.

Посилання ред.