Udostępnij przez


Dokumentacja pliku AVI RIFF

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Format pliku Microsoft AVI to specyfikacja pliku RIFF używana z aplikacjami, które przechwytują, edytują i odtwarzają sekwencje audio-wideo. Ogólnie rzecz biorąc, pliki AVI zawierają wiele strumieni różnych typów danych. Większość sekwencji AVI używa strumieni audio i wideo. Prosta odmiana sekwencji AVI używa danych wideo i nie wymaga strumienia audio.

W tej sekcji nie opisano rozszerzeń formatu plików AVI OpenDML. Aby uzyskać więcej informacji na temat tych rozszerzeń, zobacz Rozszerzenia formatu plików AVI OpenDML, opublikowane przez Podkomisji formatu plików AVI M-JPEG OpenDML.

FOURCCs

FourCC (czteroznaczny kod) to 32-bitowa liczba całkowita bez znaku utworzona przez łączenie czterech znaków ASCII. Na przykład funkcja FOURCC "abcd" jest reprezentowana w systemie Little-Endian jako 0x64636261. FourCCs może zawierać znaki spacji, więc "abc" jest prawidłowym znakiem FOURCC. Format pliku AVI używa kodów FOURCC do identyfikowania typów strumieni, fragmentów danych, wpisów indeksu i innych informacji.

Format pliku RIFF

Format pliku AVI jest oparty na formacie dokumentu RIFF (format pliku wymiany zasobów). Plik RIFF składa się z nagłówka RIFF, po którym następuje zero lub więcej list i fragmentów .

  • Nagłówek RIFF ma następującą postać:

    'RIFF' fileSize fileType (data)

    gdzie "RIFF" to literał KOD FOURCC "RIFF", fileSize jest wartością 4-bajtową dającą rozmiar danych w pliku, a fileType jest ZNAKIem FOURCC, który identyfikuje określony typ pliku. Wartość fileSize zawiera rozmiar fileType FOURCC oraz rozmiar poniższych danych, ale nie zawiera rozmiaru "RIFF" FOURCC lub rozmiaru fileSize. Dane pliku składają się z fragmentów i list w dowolnej kolejności.

  • Fragment ma następującą formę:

    ckID ckSize ckData

    gdzie ckID to FOURCC, który identyfikuje dane zawarte w fragmentach, ckSize jest wartością 4-bajtową dającą rozmiar danych w ckData, a ckData wynosi zero lub więcej bajtów danych. Dane są zawsze dopełniane do najbliższej granicy programu WORD. ckSize daje rozmiar prawidłowych danych we fragmentu; nie zawiera wypełnienia, rozmiaru ckIDlub rozmiaru ckSize.

  • Lista ma następujący formularz:

    'LIST' listSize listType listData

    gdzie "LIST" to literał KOD FOURCC "LIST", listSize jest wartością 4-bajtową dającą rozmiar listy, listType jest kodem FOURCC, a listData składa się z fragmentów lub list w dowolnej kolejności. Wartość listSize obejmuje rozmiar listType oraz rozmiar listData; nie zawiera "LIST" FOURCC ani rozmiaru listSize.

W pozostałej części tej sekcji użyto następującej notacji do opisania fragmentów RIFF:

ckID ( ckData )

gdzie rozmiar fragmentu jest niejawny. Korzystając z tej notacji, lista może być reprezentowana jako:

'LIST' ( listType ( listData ) )

Elementy opcjonalne są umieszczane w nawiasach kwadratowych: [ optional element ]

Formularz AVI RIFF

Pliki AVI są identyfikowane przez FOURCC "AVI" w nagłówku RIFF. Wszystkie pliki AVI zawierają dwa obowiązkowe fragmenty list, które definiują odpowiednio format strumieni i danych strumienia. Plik AVI może również zawierać fragment indeksu, który daje lokalizację fragmentów danych w pliku. Plik AVI z tymi składnikami ma następującą postać:

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

Lista "hdrl" definiuje format danych i jest pierwszym wymaganym fragmentem listy. Lista "movi" zawiera dane dla sekwencji AVI i jest drugim wymaganym fragmentem LISTY. Lista "idx1" zawiera indeks. Pliki AVI muszą zachować te trzy składniki w odpowiedniej sekwencji.

Nuta

Rozszerzenia OpenDML definiują inny typ indeksu zidentyfikowanego przez element FOURCC "indx".

 

Listy "hdrl" i "movi" używają fragmentów dla swoich danych. W poniższym przykładzie pokazano formularz AVI RIFF rozwinięty z fragmentami wymaganymi do ukończenia tych list:

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>) ]
     )

Główny nagłówek AVI

Lista "hdrl" zaczyna się od głównego nagłówka AVI, który znajduje się w "avih" fragment. Główny nagłówek zawiera globalne informacje dotyczące całego pliku AVI, takie jak liczba strumieni w pliku oraz szerokość i wysokość sekwencji AVI. Główny fragment nagłówka składa się z struktury AVIMAINHEADER.

Nagłówki strumienia AVI

Co najmniej jedna lista "strl" następuje po nagłówku głównym. Lista "strl" jest wymagana dla każdego strumienia danych. Każda lista "strl" zawiera informacje o jednym strumieniu w pliku i musi zawierać fragment nagłówka strumienia ('strh') i fragment formatu strumienia ('strf'). Ponadto lista "strl" może zawierać fragment danych nagłówka strumienia ('strd') i fragment nazwy strumienia ('strn').

Fragment nagłówka strumienia ('strh') składa się z struktury AVISTREAMHEADER.

Fragment formatu strumienia ('strf') musi być zgodny ze fragmentem nagłówka strumienia. Fragment formatu strumienia opisuje format danych w strumieniu. Dane zawarte w tym fragmentzie zależą od typu strumienia. W przypadku strumieni wideo informacje są strukturą BITMAPINFO, w tym informacje o palecie, jeśli są odpowiednie. W przypadku strumieni audio informacje są strukturą WAVEFORMATEX.

Jeśli fragment danych nagłówka strumienia ('strd') jest obecny, jest zgodny z fragmentem formatu strumienia. Format i zawartość tego fragmentu są definiowane przez sterownik koderów. Zazwyczaj sterowniki używają tych informacji do konfiguracji. Aplikacje odczytujące i zapisujące pliki AVI nie muszą interpretować tych informacji; proste przeniesienie go do i z sterownika jako bloku pamięci.

Opcjonalny fragment "strn" zawiera ciąg tekstowy o wartości null opisujący strumień.

Nagłówki strumienia na liście "hdrl" są skojarzone z danymi strumienia na liście "movi" zgodnie z kolejnością fragmentów "strl". Pierwszy fragment "strl" dotyczy strumienia 0, drugi dotyczy strumienia 1 i tak dalej.

Dane strumienia (lista movi)

Po nagłówku znajduje się lista "movi", która zawiera rzeczywiste dane w strumieniach — czyli ramki wideo i przykłady audio. Fragmenty danych mogą znajdować się bezpośrednio na liście "movi" lub mogą być grupowane na listach "rec". Grupowanie "rec" oznacza, że zgrupowane fragmenty powinny być odczytywane z dysku jednocześnie i jest przeznaczone dla plików, które są przeplatane do odtwarzania z CD-ROM.

Funkcja FOURCC, która identyfikuje każdy fragment danych, składa się z dwucyfrowego numeru strumienia, po którym następuje dwuznaczny kod definiujący typ informacji we fragmentu.

Dwuznaczny kod Opis
Db Nieskompresowana ramka wideo
Dc Skompresowana ramka wideo
komputer osobisty Zmiana palety
Wb Dane audio

 

Jeśli na przykład strumień 0 zawiera dźwięk, fragmenty danych dla tego strumienia będą miały wartość FOURCC "00wb". Jeśli strumień 1 zawiera wideo, fragmenty danych dla tego strumienia będą miały wartość FOURCC "01db" lub "01dc". Fragmenty danych wideo mogą również definiować nowe wpisy palety w celu zaktualizowania palety podczas sekwencji AVI. Każdy fragment zmiany palety ('xxpc') zawiera strukturę AVIPALCHANGE. Jeśli strumień zawiera zmiany palety, ustaw flagę AVISF_VIDEO_PALCHANGES w dwFlags elementu członkowskiego AVISTREAMHEADER struktury dla tego strumienia.

Strumienie tekstowe mogą używać dowolnych dwuznakowych kodów.

Wpisy indeksu AVI

indeks AVI 1.0

Opcjonalny fragment indeksu ('idx1') może podążać za listą "movi". Indeks zawiera listę fragmentów danych i ich lokalizację w pliku. Składa się z struktury AVIOLDINDEX z wpisami dla każdego fragmentu danych, w tym fragmentami "rec". Jeśli plik zawiera indeks, ustaw flagę AVIF_HASINDEX w dwFlags elementu członkowskiego AVIMAINHEADER.

indeks AVI 2.0

Indeks AVI 2.0 może być wyświetlany jako pojedynczy fragment. Alternatywnie segmenty indeksów można przeplatać w ramach fragmentu "movi". Jeśli segmenty indeksu są umieszczane w fragmentze "movi", indeks super zawiera indeks segmentów indeksu. Struktura AVIMETAINDEX jest podstawową strukturą zarówno dla segmentów indeksu, jak i indeksu super. Aby uzyskać więcej informacji, zobacz Rozszerzenia formatu plików AVI OpenDML, opublikowane przez Podkomisji formatu plików AVI M-JPEG OpenDML. (Ten zasób może być niedostępny w niektórych językach i krajach).

Inne fragmenty danych

Dane można wyrównać do pliku AVI, wstawiając fragmenty "JUNK" zgodnie z potrzebami. Aplikacje powinny ignorować zawartość fragmentu "ŚMIECI".

format pliku AVI