AVI RIFF 파일 참조

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

Microsoft AVI 파일 형식은 오디오 비디오 시퀀스를 캡처, 편집 및 재생하는 애플리케이션에 사용되는 RIFF 파일 사양입니다. 일반적으로 AVI 파일에는 다양한 유형의 여러 데이터 스트림이 포함됩니다. 대부분의 AVI 시퀀스는 오디오 스트림과 비디오 스트림을 모두 사용합니다. AVI 시퀀스에 대한 간단한 변형은 비디오 데이터를 사용하며 오디오 스트림이 필요하지 않습니다.

이 섹션에서는 OpenDML AVI 파일 형식 확장자를 설명하지 않습니다. 이러한 확장에 대한 자세한 내용은 OpenDML AVI M-JPEG 파일 형식 하위위원회가 게시한 OpenDML AVI 파일 형식 확장자를 참조하세요.

FOURC

FOURCC(4자 코드)는 4개의 ASCII 문자를 연결하여 만든 32비트 부호 없는 정수입니다. 예를 들어 FOURCC 'abcd'는 Little-Endian 시스템에서 0x64636261 표시됩니다. FOURC는 공백 문자를 포함할 수 있으므로 'abc'는 유효한 FOURCC입니다. AVI 파일 형식은 FOURCC 코드를 사용하여 스트림 형식, 데이터 청크, 인덱스 항목 및 기타 정보를 식별합니다.

RIFF 파일 형식

AVI 파일 형식은 RIFF(리소스 교환 파일 형식) 문서 형식을 기반으로 합니다. RIFF 파일은 RIFF 헤더와 0개 이상의 목록청크로 구성됩니다.

  • RIFF 헤더의 형식은 다음과 같습니다.

    'RIFF' fileSize fileType (data)

    여기서 'RIFF'는 리터럴 FOURCC 코드 'RIFF'이며 파일 fileSize 의 데이터 크기를 제공하는 4 바이트 값이며 fileType 특정 파일 형식을 식별하는 FOURCC입니다. 의 fileSize 값에는 FOURCC의 fileType 크기와 다음 데이터의 크기가 포함되지만 'RIFF' FOURCC의 크기 또는 크기 fileSize는 포함되지 않습니다. 파일 데이터는 어떤 순서로든 청크 및 목록으로 구성됩니다.

  • 청크 형식은 다음과 같습니다.

    ckID ckSize ckData

    여기서 ckID 는 청크에 포함된 데이터를 식별하는 FOURCC이고 는 ckSize 의 데이터 ckData크기를 제공하는 4바이트 값이며 ckData 0바이트 이상의 데이터입니다. 데이터는 항상 가장 가까운 WORD 경계에 패딩됩니다. ckSize는 청크에 있는 유효한 데이터의 크기를 제공합니다. 안쪽 여백, 크기 또는 의 크기ckIDckSize는 포함되지 않습니다.

  • 목록에는 다음과 같은 형식이 있습니다.

    'LIST' listSize listType listData

    여기서 'LIST'는 리터럴 FOURCC 코드 'LIST'이며, listSize 목록 크기를 제공하는 4 바이트 값이고, listType FOURCC 코드이며 listData , 모든 순서로 청크 또는 목록으로 구성됩니다. 의 listSize 값에는 의 크기와 의 크기 listTypelistData가 포함됩니다. 'LIST' FOURCC 또는 의 크기 listSize는 포함되지 않습니다.

이 섹션의 나머지 부분에서는 다음 표기법을 사용하여 RIFF 청크를 설명합니다.

ckID ( ckData )

여기서 청크 크기는 암시적입니다. 이 표기법을 사용하여 목록을 다음과 같이 나타낼 수 있습니다.

'LIST' ( listType ( listData ) )

선택적 요소는 대괄호 안에 배치됩니다. [ optional element ]

AVI RIFF 양식

AVI 파일은 RIFF 헤더의 FOURCC 'AVI'로 식별됩니다. 모든 AVI 파일에는 각각 스트림 및 스트림 데이터의 형식을 정의하는 두 개의 필수 LIST 청크가 포함됩니다. AVI 파일에는 파일 내의 데이터 청크의 위치를 제공하는 인덱스 청크가 포함될 수도 있습니다. 이러한 구성 요소가 있는 AVI 파일의 형식은 다음과 같습니다.

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

'hdrl' 목록은 데이터의 형식을 정의하며 첫 번째 필수 LIST 청크입니다. 'movi' 목록에는 AVI 시퀀스에 대한 데이터가 포함되며 두 번째 필수 LIST 청크입니다. 'idx1' 목록에는 인덱스가 포함됩니다. AVI 파일은 이러한 세 가지 구성 요소를 적절한 순서로 유지해야 합니다.

참고

OpenDML 확장은 FOURCC 'indx'로 식별되는 다른 유형의 인덱스를 정의합니다.

 

'hdrl' 및 'movi' 목록은 데이터에 하위 펑크를 사용합니다. 다음 예제에서는 이러한 목록을 완료하는 데 필요한 청크로 확장된 AVI RIFF 양식을 보여 줍니다.

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' 목록은 'avih' 청크에 포함된 기본 AVI 헤더로 시작합니다. 기본 헤더에는 파일 내의 스트림 수, AVI 시퀀스의 너비 및 높이와 같은 전체 AVI 파일에 대한 전역 정보가 포함됩니다. 기본 헤더 청크는 AVIMAINHEADER 구조체로 구성됩니다.

AVI 스트림 헤더

하나 이상의 'strl' 목록이 기본 헤더를 따릅니다. 각 데이터 스트림에 대해 'strl' 목록이 필요합니다. 각 'strl' 목록에는 파일의 한 스트림에 대한 정보가 포함되며 스트림 헤더 청크('strh') 및 스트림 형식 청크('strf')가 포함되어야 합니다. 또한 'strl' 목록에는 스트림 헤더 데이터 청크('strd') 및 스트림 이름 청크('strn')가 포함될 수 있습니다.

스트림 헤더 청크('strh')는 AVISTREAMHEADER 구조체로 구성됩니다.

스트림 형식 청크('strf')는 스트림 헤더 청크를 따라야 합니다. 스트림 형식 청크는 스트림의 데이터 형식을 설명합니다. 이 청크에 포함된 데이터는 스트림 유형에 따라 달라집니다. 비디오 스트림의 경우 정보는 적절한 경우 팔레트 정보를 포함하여 BITMAPINFO 구조입니다. 오디오 스트림의 경우 정보는 WAVEFORMATEX 구조체입니다.

스트림 헤더 데이터('strd') 청크가 있는 경우 스트림 형식 청크를 따릅니다. 이 청크의 형식과 콘텐츠는 코덱 드라이버에 의해 정의됩니다. 일반적으로 드라이버는 구성에 이 정보를 사용합니다. AVI 파일을 읽고 쓰는 애플리케이션은 이 정보를 해석할 필요가 없습니다. 메모리 블록으로 드라이버 간을 간단하게 전송합니다.

선택적 'strn' 청크에는 스트림을 설명하는 null로 끝나는 텍스트 문자열이 포함되어 있습니다.

'hdrl' 목록의 스트림 헤더는 'strl' 청크의 순서에 따라 'movi' 목록의 스트림 데이터와 연결됩니다. 첫 번째 'strl' 청크는 스트림 0에 적용되고, 두 번째 청크는 스트림 1 등에 적용됩니다.

스트림 데이터('movi' 목록)

헤더 정보 다음에는 스트림의 실제 데이터, 즉 비디오 프레임 및 오디오 샘플이 포함된 'movi' 목록이 있습니다. 데이터 청크는 'movi' 목록에 직접 상주하거나 'rec' 목록 내에서 그룹화될 수 있습니다. 'rec' 그룹화는 그룹화된 청크를 한 번에 디스크에서 읽어야 하며 CD-ROM에서 재생하기 위해 인터리빙된 파일을 위한 것입니다.

각 데이터 청크를 식별하는 FOURCC는 두 자리 스트림 번호와 청크의 정보 형식을 정의하는 두 문자 코드로 구성됩니다.

2자 코드 Description
db 압축되지 않은 비디오 프레임
dc 압축된 비디오 프레임
pc 색상표 변경
Wb 오디오 데이터

 

예를 들어 스트림 0에 오디오가 포함된 경우 해당 스트림의 데이터 청크에는 FOURCC '00wb'가 포함됩니다. stream 1에 비디오가 포함된 경우 해당 스트림의 데이터 청크에는 FOURCC '01db' 또는 '01dc'가 포함됩니다. 비디오 데이터 청크는 AVI 시퀀스 중에 색상표를 업데이트하는 새 팔레트 항목을 정의할 수도 있습니다. 각 팔레트 변경 청크('xxpc')에는 AVIPALCHANGE 구조체가 포함됩니다. 스트림에 색상표 변경 내용이 포함된 경우 해당 스트림에 대한AVISTREAMHEADER 구조체의 dwFlags 멤버에서 AVISF_VIDEO_PALCHANGES 플래그를 설정합니다.

텍스트 스트림은 임의의 두 문자 코드를 사용할 수 있습니다.

AVI 인덱스 항목

AVI 1.0 인덱스

선택적 인덱스('idx1') 청크는 'movi' 목록을 따를 수 있습니다. 인덱스에는 파일의 데이터 청크 목록과 해당 위치가 포함됩니다. 'rec' 청크를 포함하여 각 데이터 청크에 대한 항목이 있는 AVIOLDINDEX 구조체로 구성됩니다. 파일에 인덱스가 포함된 경우 AVIMAINHEADER 구조체의 dwFlags 멤버에서 AVIF_HASINDEX 플래그를 설정합니다.

AVI 2.0 인덱스

AVI 2.0 인덱스가 단일 청크로 나타날 수 있습니다. 또는 인덱스 세그먼트를 'movi' 청크 내에서 인터리브할 수 있습니다. 인덱스 세그먼트가 'movi' 청크에 배치되면 슈퍼 인덱스에 인덱스 세그먼트의 인덱스가 포함됩니다. AVIMETAINDEX 구조체는 인덱스 세그먼트와 슈퍼 인덱스 모두에 대한 기본 구조체입니다. 자세한 내용은 OpenDML AVI M-JPEG 파일 형식 소위원회에서 게시한 OpenDML AVI 파일 형식 확장자를 참조하세요. (일부 언어 및 국가에서는 이 리소스를 사용할 수 없습니다.)

기타 데이터 청크

필요에 따라 'JUNK' 청크를 삽입하여 데이터를 AVI 파일에 정렬할 수 있습니다. 애플리케이션은 'JUNK' 청크의 내용을 무시해야 합니다.

AVI 파일 형식