AVI RIFF-Dateireferenz

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Das Microsoft AVI-Dateiformat ist eine RIFF-Dateispezifikation, die für Anwendungen verwendet wird, die Audio-Videosequenzen erfassen, bearbeiten und wiedergeben. Im Allgemeinen enthalten AVI-Dateien mehrere Datenströme verschiedener Arten von Daten. Die meisten AVI-Sequenzen verwenden sowohl Audio- als auch Videostreams. Eine einfache Variante für eine AVI-Sequenz verwendet Videodaten und erfordert keinen Audiodatenstrom.

In diesem Abschnitt werden die OpenDML AVI-Dateiformaterweiterungen nicht beschrieben. Weitere Informationen zu diesen Erweiterungen finden Sie unter OpenDML AVI-Dateiformaterweiterungen, veröffentlicht vom OpenDML AVI M-JPEG File Format Subcommittee.

FOURCCs

Ein FOURCC (Vierzeichencode) ist eine 32-Bit-Ganzzahl ohne Vorzeichen, die durch Verkettung von vier ASCII-Zeichen erstellt wird. Beispielsweise wird fourcc "abcd" auf einem Little-Endian System als 0x64636261 dargestellt. FOURCCs können Leerzeichen enthalten, daher ist "abc" ein gültiges FOURCC. Das AVI-Dateiformat verwendet FOURCC-Codes, um Streamtypen, Datenblöcke, Indexeinträge und andere Informationen zu identifizieren.

RIFF-Dateiformat

Das AVI-Dateiformat basiert auf dem RIFF-Dokumentformat (Resource Interchange File Format). Eine RIFF-Datei besteht aus einem RIFF-Header gefolgt von null oder mehr Listen und Blöcken.

  • Der RIFF-Header hat die folgende Form:

    'RIFF' fileSize fileType (data)

    wobei "RIFF" der literale FOURCC-Code "RIFF", ein 4-Byte-Wert ist, fileSize der die Größe der Daten in der Datei angibt, und fileType ein FOURCC-Wert ist, der den spezifischen Dateityp identifiziert. Der Wert von fileSize umfasst die Größe des fileType FOURCC plus die Größe der folgenden Daten, enthält aber nicht die Größe des "RIFF"-FOURCC oder die Größe von fileSize. Die Dateidaten bestehen aus Blöcken und Listen in beliebiger Reihenfolge.

  • Ein Block hat die folgende Form:

    ckID ckSize ckData

    dabei ckID ist ein FOURCC, der die im Block enthaltenen Daten identifiziert, ein 4-Byte-Wert ist, ckSize der die Größe der Daten in ckDataangibt und ckData null oder mehr Datenbytes ist. Die Daten sind immer auf die nächste WORD-Grenze gepolstert. ckSize gibt die Größe der gültigen Daten im Block an; Sie enthält nicht die Auffüllung, die Größe von ckIDoder die Größe von ckSize.

  • Eine Liste hat die folgende Form:

    'LIST' listSize listType listData

    wobei "LIST" der literale FOURCC-Code "LIST" ist, listSize ein 4-Byte-Wert ist, der die Größe der Liste angibt, listType ist ein FOURCC-Code und listData besteht aus Blöcken oder Listen in beliebiger Reihenfolge. Der Wert von listSize enthält die Größe von listType plus die Größe von listData. Er enthält nicht die "LIST"-FOURCC-Größe oder die Größe von listSize.

Der Rest dieses Abschnitts verwendet die folgende Notation, um RIFF-Blöcke zu beschreiben:

ckID ( ckData )

wobei die Blockgröße implizit ist. Mit dieser Notation kann eine Liste wie folgt dargestellt werden:

'LIST' ( listType ( listData ) )

Optionale Elemente werden in Klammern platziert: [ optional element ]

AVI RIFF-Formular

AVI-Dateien werden durch den FOURCC "AVI" im RIFF-Header identifiziert. Alle AVI-Dateien enthalten zwei obligatorische LIST-Blöcke, die das Format der Streams bzw. der Streamdaten definieren. Eine AVI-Datei kann auch einen Indexblock enthalten, der den Speicherort der Datenblöcke in der Datei angibt. Eine AVI-Datei mit diesen Komponenten hat die folgende Form:

RIFF ('AVI '
      LIST ('hdrl' ... )
      LIST ('movi' ... )
      ['idx1' (<AVI Index>) ]
     )

Die 'hdrl'-Liste definiert das Format der Daten und ist der erste erforderliche LIST-Blöcke. Die Liste "movi" enthält die Daten für die AVI-Sequenz und ist der zweite erforderliche LIST-Blöcke. Die Liste "idx1" enthält den Index. AVI-Dateien müssen diese drei Komponenten in der richtigen Sequenz beibehalten.

Hinweis

Die OpenDML-Erweiterungen definieren einen anderen Indextyp, der durch fourcc "indx" identifiziert wird.

 

Die Listen "hdrl" und "movi" verwenden Teilchunks für ihre Daten. Das folgende Beispiel zeigt das AVI RIFF-Formular, das mit den Blöcken erweitert wird, die zum Ausfüllen dieser Listen erforderlich sind:

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-Hauptheader

Die Liste "hdrl" beginnt mit dem Standard AVI-Header, der in einem Avih-Block enthalten ist. Der Standard-Header enthält globale Informationen für die gesamte AVI-Datei, z. B. die Anzahl der Datenströme in der Datei sowie die Breite und Höhe der AVI-Sequenz. Der Standard Headerblock besteht aus einer AVIMAINHEADER-Struktur.

AVI-Streamheader

Mindestens eine "strl"-Liste folgt dem Standard-Header. Für jeden Datenstrom ist eine "strl"-Liste erforderlich. Jede "strl"-Liste enthält Informationen zu einem Stream in der Datei und muss einen Streamheaderblock ('strh') und einen Streamformatblock ('strf') enthalten. Darüber hinaus kann eine 'strl'-Liste einen Datenblock mit Streamheader ('strd') und einen Streamnamensblock ('strn') enthalten.

Der Streamheaderblock ('strh') besteht aus einer AVISTREAMHEADER-Struktur .

Ein Streamformatblock ('strf') muss dem Streamheaderblock folgen. Der Streamformatblock beschreibt das Format der Daten im Stream. Die in diesem Block enthaltenen Daten hängen vom Streamtyp ab. Bei Videostreams handelt es sich bei den Informationen um eine BITMAPINFO-Struktur , die ggf. Paletteninformationen enthält. Bei Audiostreams handelt es sich bei den Informationen um eine WAVEFORMATEX-Struktur .

Wenn der Datenblock des Streamheaders ('strd') vorhanden ist, folgt er dem Streamformatblock. Das Format und der Inhalt dieses Blöckes werden vom Codectreiber definiert. In der Regel verwenden Treiber diese Informationen für die Konfiguration. Anwendungen, die AVI-Dateien lesen und schreiben, müssen diese Informationen nicht interpretieren. Sie übertragen es einfach als Speicherblock an und vom Treiber.

Der optionale Abschnitt "strn" enthält eine Textzeichenfolge mit NULL-Beendigung, die den Stream beschreibt.

Die Streamheader in der Liste "hdrl" sind den Streamdaten in der "movi"-Liste entsprechend der Reihenfolge der "strl"-Blöcke zugeordnet. Der erste "strl"-Block gilt für Stream 0, der zweite für Stream 1 usw.

Daten streamen ('movi'-Liste)

Nach den Headerinformationen ist eine "movi"-Liste, die die tatsächlichen Daten in den Streams enthält, d. h. die Videoframes und Audiobeispiele. Die Datenblöcke können sich direkt in der "movi"-Liste befinden, oder sie können in "rec"-Listen gruppiert werden. Die Gruppierung "rec" impliziert, dass die gruppierten Blöcke auf einmal vom Datenträger gelesen werden sollen, und ist für Dateien vorgesehen, die für die Wiedergabe von CD-ROM verschachtelt sind.

Der FOURCC, der die einzelnen Datenblöcke identifiziert, besteht aus einer zweistelligen Datenstromnummer gefolgt von einem zweistelligen Code, der den Typ der Informationen im Block definiert.

Code mit zwei Zeichen BESCHREIBUNG
db Nicht komprimierter Videoframe
dc Komprimierter Videorahmen
pc Palettenwechsel
Wb Audiodaten

 

Wenn Stream 0 beispielsweise Audio enthält, haben die Datenblöcke für diesen Stream den FOURCC -Wert "00wb". Wenn Stream 1 Video enthält, haben die Datenblöcke für diesen Stream die FOURCC -Version "01db" oder "01dc". Videodatenblöcke können auch neue Paletteneinträge definieren, um die Palette während einer AVI-Sequenz zu aktualisieren. Jeder Palettenänderungsblock ('xxpc') enthält eine AVIPALCHANGE-Struktur . Wenn ein Stream Palettenänderungen enthält, legen Sie das AVISF_VIDEO_PALCHANGES-Flag im dwFlags-Element der AVISTREAMHEADER-Struktur für diesen Stream fest.

Textstreams können beliebige zweistellige Codes verwenden.

AVI-Indexeinträge

AVI 1.0-Index

Ein optionaler Indexabschnitt ('idx1') kann der 'movi'-Liste folgen. Der Index enthält eine Liste der Datenblöcke und deren Speicherort in der Datei. Es besteht aus einer AVIOLDINDEX-Struktur mit Einträgen für jeden Datenblock, einschließlich "rec"-Blöcken. Wenn die Datei einen Index enthält, legen Sie das AVIF_HASINDEX-Flag im dwFlags-Member der AVIMAINHEADER-Struktur fest.

AVI 2.0-Index

Ein AVI 2.0-Index kann als einzelner Block angezeigt werden. Alternativ können Indexsegmente im Segment "movi" verschachtelt werden. Wenn die Indexsegmente im Segment "movi" platziert werden, enthält ein Superindex einen Index der Indexsegmente. Die AVIMETAINDEX-Struktur ist die Basisstruktur für die Indexsegmente und den Superindex. Weitere Informationen finden Sie in den OpenDML AVI-Dateiformaterweiterungen, die vom OpenDML AVI M-JPEG-Dateiformatunterausschuss veröffentlicht wurden. (Diese Ressource ist in einigen Sprachen und Ländern möglicherweise nicht verfügbar.)

Andere Datenblöcke

Daten können in einer AVI-Datei ausgerichtet werden, indem nach Bedarf JUNK-Blöcke eingefügt werden. Anwendungen sollten den Inhalt eines JUNK-Blöckes ignorieren.

AVI-Dateiformat