H.264 비디오 형식
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
다음 미디어 하위 형식은 H.264 비디오에 대해 정의됩니다.
하위 | FOURCC | 묘사 |
---|---|---|
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 비트스트림
공중으로 전송되거나 MPEG-2 프로그램 또는 전송 스트림에 포함되거나 HD-DVD에 기록되는 H.264 비트스트림은 ITU-T Rec. H.264의 부록 B에 설명된 대로 형식이 지정됩니다. 이 사양에 따라 비트스트림은 NALUs(네트워크 추상화 계층 단위) 시퀀스로 구성되며, 각 단위에는 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 |
하위 | 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 단위는 샘플에 걸쳐 있지 않습니다. 이렇게 하면 디코더가 데이터 손상 또는 삭제된 샘플에서 복구할 수 있습니다.