Справочник по RIFF-файлу AVI
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Формат файла Microsoft AVI — это спецификация RIFF-файла, используемая с приложениями, которые захватывают, редактируют и воспроизводит последовательности аудио-видео. Как правило, файлы AVI содержат несколько потоков данных разных типов. Большинство последовательностей AVI используют аудио- и видеопотоки. Простой вариант последовательности AVI использует видеоданные и не требует аудиопотока.
В этом разделе не описываются расширения формата файлов OpenDML AVI. Дополнительные сведения об этих расширениях см. в разделе Расширения формата файлов OpenDML AVI, опубликованные Подкомитетом по формату файлов OpenDML AVI M-JPEG.
FOURCC
FOURCC (четырехзначный код) — это 32-разрядное целое число без знака, созданное путем объединения четырех символов ASCII. Например, функция FOURCC "abcd" представлена в Little-Endian системе как 0x64636261. FOURCC может содержать пробелы, поэтому 'abc' является допустимым FOURCC. Формат файла AVI использует коды FOURCC для идентификации типов потоков, блоков данных, записей индекса и других сведений.
Формат RIFF-файла
Формат файла AVI основан на формате документа RIFF (формат файла обмена ресурсами). RIFF-файл состоит из заголовка RIFF, за которым следует ноль или несколько списков и блоков.
Заголовок RIFF имеет следующую форму:
'RIFF' fileSize fileType (data)
где "RIFF" — это литеральный код FOURCC "RIFF",
fileSize
4-байтовое значение, определяющее размер данных в файле, иfileType
значение FOURCC, определяющее конкретный тип файла. ЗначениеfileSize
включает размерfileType
FOURCC плюс размер следующих данных, но не включает размер "RIFF" FOURCC или размерfileSize
. Данные файла состоят из блоков и списков в любом порядке.Блок имеет следующую форму:
ckID ckSize ckData
где
ckID
— это FOURCC, который идентифицирует данные, содержащиеся в блоке,ckSize
— 4-байтовое значение, определяющее размер данных вckData
, иckData
равно нулю или более байтам данных. Данные всегда заполняются до ближайшей границы WORD .ckSize
предоставляет размер допустимых данных в блоке; Он не включает заполнение, размерckID
или размерckSize
.Список имеет следующую форму:
'LIST' listSize listType listData
где "LIST" — это литеральный код FOURCC "LIST",
listSize
4-байтовое значение, указывающее размер списка,listType
является кодом FOURCC иlistData
состоит из блоков или списков в любом порядке. ЗначениеlistSize
включает размерlistType
плюс размерlistData
; оно не включает "LIST" FOURCC или размерlistSize
.
В оставшейся части этого раздела для описания фрагментов RIFF используется следующая нотация:
ckID ( ckData )
где размер блока является неявным. Используя эту нотацию, список можно представить следующим образом:
'LIST' ( listType ( listData ) )
Необязательные элементы помещаются в квадратные скобки: [ optional element ]
Форма RIFF AVI
AVI-файлы идентифицируются с помощью FOURCC 'AVI' в заголовке RIFF. Все файлы AVI включают два обязательных блока LIST, которые определяют формат потоков и данных потока соответственно. AVI-файл также может содержать блок индекса, который определяет расположение блоков данных в файле. Файл AVI с этими компонентами имеет следующую форму:
RIFF ('AVI '
LIST ('hdrl' ... )
LIST ('movi' ... )
['idx1' (<AVI Index>) ]
)
Список hdrl определяет формат данных и является первым обязательным блоком LIST. Список "movi" содержит данные для последовательности AVI и является вторым обязательным блоком LIST. Список idx1 содержит индекс. Файлы AVI должны поддерживать эти три компонента в правильной последовательности.
Примечание
Расширения OpenDML определяют другой тип индекса, определяемый indx FOURCC.
В списках "hdrl" и "movi" для своих данных используются вложенные фрагменты. В следующем примере показана форма RIFF AVI, развернутая блоками, необходимыми для заполнения этих списков:
RIFF ('AVI '
LIST ('hdrl'
'avih'(<Main AVI Header>)
LIST ('strl'
'strh'(<Stream header>)
'strf'(<Stream format>)
[ 'strd'(<Additional header data>) ]
[ 'strn'(<Stream name>) ]
...
)
...
)
LIST ('movi'
{SubChunk | LIST ('rec '
SubChunk1
SubChunk2
...
)
...
}
...
)
['idx1' (<AVI Index>) ]
)
Главный заголовок AVI
Список hdrl начинается с заголовка main AVI, который содержится в блоке avih. Заголовок main содержит глобальные сведения для всего файла AVI, например количество потоков в файле, а также ширину и высоту последовательности AVI. Блок заголовка main состоит из структуры AVIMAINHEADER.
Заголовки потока AVI
Один или несколько списков strl следуют за заголовком main. Для каждого потока данных требуется список strl. Каждый список strl содержит сведения об одном потоке в файле и должен содержать блок заголовка потока (strh) и блок формата потока (strf). Кроме того, список strl может содержать блок данных заголовка потока (strd) и блок имени потока (strn).
Блок заголовка потока (strh) состоит из структуры AVISTREAMHEADER .
Блок формата потока (strf) должен следовать за блоком заголовка потока. Фрагмент формата потока описывает формат данных в потоке. Данные, содержащиеся в этом блоке, зависят от типа потока. Для видеопотоков эти сведения являются структурой BITMAPINFO , включая сведения о палитре, если это необходимо. Для аудиопотоков информация представляет собой структуру WAVEFORMATEX .
Если присутствует блок данных заголовка потока (strd), он следует блоку формата потока. Формат и содержимое этого блока определяются драйвером кодека. Как правило, драйверы используют эти сведения для настройки. Приложениям, которые считывают и записывают AVI-файлы, не нужно интерпретировать эти сведения; они просто переносят его в драйвер и из него в качестве блока памяти.
Необязательный блок strn содержит текстовую строку, завершающуюся null, описывающую поток.
Заголовки потоков в списке hdrl связаны с данными потока в списке movi в соответствии с порядком блоков strl. Первый блок strl применяется к потоку 0, второй — к потоку 1 и т. д.
Поток данных (список movi)
После сведений заголовка отображается список movi, содержащий фактические данные в потоках, то есть видеокадры и примеры звука. Блоки данных могут находиться непосредственно в списке movi или быть сгруппированы в списки rec. Группирование "rec" подразумевает, что сгруппированные блоки должны считываться с диска одновременно, и предназначено для файлов, которые чередуются для воспроизведения с компакт-диска.
Функция FOURCC, идентифицирующая каждый блок данных, состоит из двухзначного номера потока, за которым следует двухзначный код, определяющий тип информации в блоке.
Двухсимвный код | Описание |
---|---|
db | Несжатый видеокадр |
dc | Сжатый видеокадр |
пк | Изменение палитры |
Wb | Звуковые данные |
Например, если поток 0 содержит звук, то блоки данных для этого потока будут иметь значение FOURCC "00wb". Если поток 1 содержит видео, блоки данных для этого потока будут иметь FOURCC "01db" или "01dc". Фрагменты видеоданных также могут определять новые записи палитры для обновления палитры во время последовательности AVI. Каждый блок изменения палитры (xxpc) содержит структуру AVIPALCHANGE . Если поток содержит изменения палитры, установите флаг AVISF_VIDEO_PALCHANGES в элементе dwFlags структуры AVISTREAMHEADER для этого потока.
Текстовые потоки могут использовать произвольные коды из двух символов.
Записи индекса AVI
-
Индекс AVI 1.0
-
Необязательный фрагмент индекса (idx1) может следовать за списком movi. Индекс содержит список блоков данных и их расположение в файле. Он состоит из структуры AVIOLDINDEX с записями для каждого блока данных, включая блоки "rec". Если файл содержит индекс, установите флаг AVIF_HASINDEX в элементе dwFlags структуры AVIMAINHEADER .
-
Индекс AVI 2.0
-
Индекс AVI 2.0 может выглядеть как один блок. Кроме того, сегменты индекса можно чередуть в пределах блока movi. Если сегменты индекса помещаются в блок movi, супериндекс содержит индекс сегментов индекса. Структура AVIMETAINDEX является базовой структурой как для сегментов индекса, так и для супериндексов. Дополнительные сведения см. в разделе Расширения формата файлов OpenDML AVI, опубликованные в AVI-OpenDML M-JPEG. (Этот ресурс может быть недоступен для некоторых языков и стран.)
Другие блоки данных
Данные можно выровнять в AVI-файле, вставив блоки "JUNK" при необходимости. Приложения должны игнорировать содержимое блока "JUNK".
Связанные темы