다음을 통해 공유


H.264 비디오 형식

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

다음 미디어 하위 형식은 H.264 비디오에 대해 정의됩니다.

Subtype Fourcc Description
MEDIASUBTYPE_AVC1 'AVC1' 시작 코드가 없는 H.264 비트스트림.
MEDIASUBTYPE_H264 'H264' 시작 코드가 있는 H.264 비트스트림.
MEDIASUBTYPE_h264 'h264' 다른 FOURCC를 사용하는 MEDIASUBTYPE_H264 동일합니다.
MEDIASUBTYPE_X264 'X264' 다른 FOURCC를 사용하는 MEDIASUBTYPE_H264 동일합니다.
MEDIASUBTYPE_x264 'x264' 다른 FOURCC를 사용하는 MEDIASUBTYPE_H264 동일합니다.

 

이러한 하위 형식 GUID는 wmcodecdsp.h에서 선언됩니다.

이러한 미디어 형식 간의 기본 차이점은 비트스트림에 시작 코드가 있다는 점입니다. 하위 형식이 MEDIASUBTYPE_AVC1 비트스트림에 시작 코드가 포함되지 않습니다.

시작 코드가 있는 H.264 Bitstream

공중으로 전송되거나 MPEG-2 프로그램 또는 전송 스트림에 포함되거나 HD-DVD에 기록되는 H.264 비트스트림은 ITU-T Rec. H.264의 부록 B에 설명된 대로 형식이 지정됩니다. 이 사양에 따라 비트스트림은 NALU(네트워크 추상화 계층 단위) 시퀀스로 구성되며, 각 에는 0x000001 또는 0x00000001 동일한 시작 코드 접두사로 지정됩니다.

비트 스트림에 시작 코드가 있는 경우 다음 미디어 형식이 사용됩니다.

레이블
주 형식 MEDIATYPE_Video
하위 유형 MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 또는 MEDIASUBTYPE_x264
형식 유형 FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video 또는 GUID_NULL

 

형식 형식이 GUID_NULL 경우 형식 구조가 없습니다.

비트스트림에 시작 코드가 포함된 경우 디코더가 스트림을 구문 분석하는 데 추가 정보가 필요하지 않으므로 여기에 나열된 형식 형식으로 충분합니다. 비트 스트림에는 디코더에 필요한 모든 정보가 이미 포함되어 있으며 시작 코드를 사용하면 디코더가 각 NALU의 시작을 찾을 수 있습니다.

다음 하위 형식은 동일합니다.

시작 코드가 없는 H.264 비트스트림

MP4 컨테이너 형식은 시작 코드 없이 H.264 데이터를 저장합니다. 대신 각 NALU에는 길이 필드가 접두사로 지정되어 NALU의 길이를 바이트 단위로 제공합니다. 길이 필드의 크기는 다를 수 있지만 일반적으로 1, 2 또는 4바이트입니다.

시작 코드가 비트스트림에 없는 경우 다음 미디어 형식이 사용됩니다.

레이블
주 형식 MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
형식 유형 FORMAT_MPEG2Video

 

형식 블록은 MPEG2VIDEOINFO 구조체입니다. 이 구조체는 다음과 같이 채워야 합니다.

  • hdr: 비트스트림을 설명하는 VIDEOINFOHEADER2 구조체입니다. 구조체의 BITMAPINFOHEADER 부분 다음에는 색 테이블이 없으며 biClrUsed는 0이어야 합니다.
  • dwStartTimeCode: 사용되지 않습니다. 0으로 설정됩니다.
  • cbSequenceHeader: dwSequenceHeader 배열의 길이(바이트)입니다.
  • dwProfile: H.264 프로필을 지정합니다.
  • dwLevel: H.264 수준을 지정합니다.
  • dwFlags: 각 NALU 앞에 표시되는 길이 필드에 사용되는 바이트 수입니다. 길이 필드는 다음 NALU의 크기를 바이트 단위로 나타냅니다. 예를 들어 dwFlags 가 4이면 각 NALU 앞에 4 바이트 길이 필드가 있습니다. 유효한 값은 1, 2 및 4입니다.
  • dwSequenceHeader: SPS(시퀀스 매개 변수 집합) 및 PPS(그림 매개 변수 집합) NALU를 포함할 수 있는 바이트 배열입니다.

MP4 컨테이너에는 SPS(시퀀스 매개 변수 집합) 또는 PPS(그림 매개 변수 집합)가 파일 헤더 또는 별도의 스트림(비디오 스트림과 별개)의 특수 NAL 단위로 포함될 수 있습니다. 형식이 설정되면 미디어 형식은 dwSequenceHeader 배열에서 SPS 및 PPS NAL 단위를 지정할 수 있습니다. cbSequenceHeader가 0보다 크면 dwSequenceHeader는 SPS 및 PPS NALU를 포함하는 바이트 배열의 시작이며, 모두 네트워크 바이트 순서(big-endian)로 2 바이트 길이 필드로 구분됩니다. SPS와 PPS, 이러한 형식 중 하나만 있거나 없음을 둘 다 가질 수 있습니다. 각 NALU의 실제 형식은 NALU 자체의 nal_unit_type 필드를 검사하여 확인할 수 있습니다.

이 미디어 형식을 사용하는 경우 각 미디어 샘플은 NALU의 시작 부분에서 시작되며 NAL 단위는 샘플에 걸쳐 있지 않습니다. 이렇게 하면 디코더가 데이터 손상 또는 삭제된 샘플에서 복구할 수 있습니다.