Freigeben über


AVI RIFF-Dateireferenz

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

Das Microsoft AVI-Dateiformat ist eine RIFF-Dateispezifikation, die mit Anwendungen verwendet wird, die Audio-Videosequenzen erfassen, bearbeiten und wiedergeben. Im Allgemeinen enthalten AVI-Dateien mehrere Datenströme unterschiedlicher Datentypen. Die meisten AVI-Sequenzen verwenden Audio- und Videodatenströme. Eine einfache Variation 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 File Format Extensions, veröffentlicht vom OpenDML AVI M-JPEG File Format Subcommittee.

FOURCCs

Ein FOURCC (vierstelliger Code) ist eine 32-Bit-ganzzahl ohne Vorzeichen, die durch Verketten von vier ASCII-Zeichen erstellt wird. Beispielsweise wird der 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 Datentypen, 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 einer RIFF-Kopfzeile gefolgt von null oder mehr Listen und Blöcken.

  • Die RIFF-Kopfzeile hat die folgende Form:

    'RIFF' fileSize fileType (data)

    dabei ist "RIFF" der literale FOURCC-Code "RIFF", fileSize ist ein 4-Byte-Wert, der die Größe der Daten in der Datei angibt, und fileType ist ein FOURCC, der den spezifischen Dateityp identifiziert. Der Wert von fileSize enthält die Größe der fileType FOURCC sowie die Größe der folgenden Daten, enthält jedoch 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 weist die folgende Form auf:

    ckID ckSize ckData

    wobei ckID ein FOURCC ist, der die im Block enthaltenen Daten identifiziert, ist ckSize ein 4-Byte-Wert, der die Größe der Daten in ckDataangibt und ckData null oder mehr Datenbytes aufweist. Die Daten werden immer bis zur nächsten WORD- Grenze aufgefüllt. ckSize gibt die Größe der gültigen Daten im Block an; sie enthält nicht den Abstand, die Größe von ckIDoder die Größe von ckSize.

  • Eine Liste weist das folgende Formular auf:

    'LIST' listSize listType listData

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

Im restlichen Teil dieses Abschnitts wird die folgende Schreibweise verwendet, um RIFF-Blöcke zu beschreiben:

ckID ( ckData )

dabei ist die Blockgröße implizit. Mithilfe dieser Schreibweise kann eine Liste wie folgt dargestellt werden:

'LIST' ( listType ( listData ) )

Optionale Elemente werden in eckigen Klammern platziert: [ optional element ]

AVI RIFF-Formular

AVI-Dateien werden im RIFF-Header vom FOURCC 'AVI' identifiziert. Alle AVI-Dateien enthalten zwei obligatorische LISTENblöcke, die das Format der Datenströme bzw. der Datenstrom definieren. Eine AVI-Datei kann auch einen Indexabschnitt enthalten, der den Speicherort der Datenblöcke innerhalb der Datei angibt. Eine AVI-Datei mit diesen Komponenten hat das folgende Formular:

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

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

Anmerkung

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

 

Die Listen "hdrl" und "movi" verwenden Unterchunks für ihre Daten. Das folgende Beispiel zeigt das AVI RIFF-Formular, das mit den Blöcken erweitert wurde, die zum Abschließen 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-Hauptkopfzeile

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

AVI Stream Headers

Mindestens eine Strl-Liste folgt der Hauptkopfzeile. Für jeden Datenstrom ist eine Strl-Liste erforderlich. Jede Strl-Liste enthält Informationen zu einem Datenstrom in der Datei und muss einen Datenstromheaderabschnitt ('strh') und einen Datenstromformatabschnitt ('strf') enthalten. Darüber hinaus kann eine "strl"-Liste einen Datenblock ('strd') und einen Datenstromnamen ('strn') enthalten.

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

Ein Datenstromformatabschnitt ('strf') muss dem Datenstromheaderabschnitt folgen. Der Datenstromformatabschnitt beschreibt das Format der Daten im Datenstrom. Die in diesem Abschnitt enthaltenen Daten hängen vom Datenstromtyp ab. Bei Videostreams handelt es sich bei den Informationen um eine BITMAPINFO- Struktur, einschließlich Paletteninformationen, falls zutreffend. Bei Audiodatenströmen handelt es sich bei den Informationen um eine WAVEFORMATEX- Struktur.

Wenn der Datenblock des Datenstromheaders ('strd') vorhanden ist, folgt er dem Datenstromformatabschnitt. Das Format und der Inhalt dieses Abschnitts 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 in und vom Treiber als Speicherblock.

Der optionale "strn"-Block enthält eine mit Null beendete Textzeichenfolge, die den Datenstrom beschreibt.

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

Daten streamen ('movi'-Liste)

Nach den Kopfzeileninformationen handelt es sich um eine "Movi"-Liste, die die tatsächlichen Daten in den Datenströmen enthält, d. h. die Videoframes und Audiobeispiele. Die Datenblöcke können sich direkt in der Liste "Movi" befinden, oder sie können in "rec"-Listen gruppiert werden. Die Gruppierung "rec" impliziert, dass die gruppierten Blöcke gleichzeitig von einem Datenträger gelesen werden sollten und für Dateien vorgesehen sind, die über CD-ROM wiedergegeben werden sollen.

Der FOURCC,der jeden Datenabschnitt 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
Gleichstrom Komprimierter Videoframe
PC Palettenänderung
Wb Audiodaten

 

Wenn Stream 0 beispielsweise Audio enthält, würden die Datenblöcke für diesen Datenstrom den FOURCC "00wb" aufweisen. Wenn Stream 1 Video enthält, verfügen die Datenblöcke für diesen Datenstrom über den FOURCC '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 Datenstrom Palettenänderungen enthält, legen Sie das AVISF_VIDEO_PALCHANGES Flag im dwFlags Member der AVISTREAMHEADER- Struktur für diesen Datenstrom fest.

Textdatenströme können beliebige zweistellige Codes verwenden.

AVI-Indexeinträge

AVI 1.0-Index

Ein optionaler Indexabschnitt ('idx1') kann der Liste "movi" folgen. Der Index enthält eine Liste der Datenblöcke und deren Speicherort in der Datei. Sie besteht aus einer AVIOLDINDEX Struktur mit Einträgen für jeden Datenabschnitt, 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 innerhalb des Blöckes "movi" interleaviert werden. Wenn die Indexsegmente im Abschnitt "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 File Format Extensions, veröffentlicht vom OpenDML AVI M-JPEG File Format Subcommittee. (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"-Abschnitts ignorieren.

AVI-Dateiformat