Udostępnij za pośrednictwem


Typy wideo H.264

[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.]

Następujące podtypy multimediów są zdefiniowane dla wideo H.264.

Podtypu FOURCC Opis
MEDIASUBTYPE_AVC1 "AVC1" Strumień bitowy H.264 bez kodów początkowych.
MEDIASUBTYPE_H264 "H264" H.264 bitstream z kodami początkowymi.
MEDIASUBTYPE_h264 "h264" Odpowiednik MEDIASUBTYPE_H264, z inną wartością FOURCC.
MEDIASUBTYPE_X264 "X264" Odpowiednik MEDIASUBTYPE_H264, z inną wartością FOURCC.
MEDIASUBTYPE_x264 "x264" Odpowiednik MEDIASUBTYPE_H264, z inną wartością FOURCC.

 

Te identyfikatory GUID podtypu są deklarowane w pliku wmcodecdsp.h.

Główną różnicą między tymi typami multimediów jest obecność kodów początkowych w strumieniu bitowym. Jeśli podtyp jest MEDIASUBTYPE_AVC1, strumień bitowy nie zawiera kodów początkowych.

Strumień bitowy H.264 z kodami początkowymi

Strumienie bitowe H.264, które są przesyłane przez powietrze lub zawarte w programie MPEG-2 lub strumieniach transportu, lub zarejestrowanych na HD-DVD, są sformatowane zgodnie z opisem w załączniku B ITU-T Rec. H.264. Zgodnie z tą specyfikacją strumień bitowy składa się z sekwencji jednostek warstwy abstrakcji sieci (NALU), z których każdy jest poprzedzony kodem początkowym równym 0x000001 lub 0x00000001.

Gdy kody początkowe znajdują się w strumieniu bitowym, używany jest następujący typ nośnika:

Etykieta Wartość
Typ główny MEDIATYPE_Video
Podtypów MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264lub MEDIASUBTYPE_x264
Typ formatu FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Videolub GUID_NULL

 

Jeśli typ formatu jest GUID_NULL, nie ma żadnej struktury formatu.

Gdy strumień bitowy zawiera kody początkowe, każdy z wymienionych tutaj typów formatów jest wystarczający, ponieważ dekoder nie wymaga żadnych dodatkowych informacji do analizowania strumienia. Strumień bitowy zawiera już wszystkie informacje potrzebne przez dekoder, a kody początkowe umożliwiają dekoderowi zlokalizowanie początku każdego modułu NALU.

Następujące podtypy są równoważne:

Strumień bitowy H.264 bez kodów początkowych

Format kontenera MP4 przechowuje dane H.264 bez kodów początkowych. Zamiast tego każdy element NALU jest poprzedzony polem długości, co daje długość nalu w bajtach. Rozmiar pola długości może się różnić, ale zazwyczaj wynosi 1, 2 lub 4 bajty.

Gdy kody początkowe nie są obecne w strumieniu bitowym, używany jest następujący typ nośnika.

Etykieta Wartość
Typ główny MEDIATYPE_Video
Podtypu MEDIASUBTYPE_AVC1
Typ formatu FORMAT_MPEG2Video

 

Blok formatu jest strukturą MPEG2VIDEOINFO. Ta struktura powinna być wypełniona w następujący sposób:

  • hdr: struktura VIDEOINFOHEADER2 opisując strumień bitowy. Nie ma tabeli kolorów po BITMAPINFOHEADER części struktury, a biClrUsed musi być zero.
  • dwStartTimeCode: nieużytowane. Ustaw wartość zero.
  • cbSequenceHeader: długość tablicy dwSequenceHeader w bajtach.
  • dwProfile: określa profil H.264.
  • dwLevel: określa poziom H.264.
  • dwFlags: liczba bajtów używanych dla pola długości wyświetlanego przed każdym NALU. Pole długości wskazuje rozmiar następującej wartości NALU w bajtach. Jeśli na przykład dwFlags wynosi 4, każdy naLU jest poprzedzony polem długości 4 bajtów. Prawidłowe wartości to 1, 2 i 4.
  • dwSequenceHeader: tablica bajtów, która może zawierać zestaw parametrów sekwencji (SPS) i zestaw parametrów obrazu (PPS) NALU.

Kontener MP4 może zawierać zestawy parametrów sekwencji (SPS) lub zestawy parametrów obrazu (PPS) jako specjalne jednostki NAL w nagłówkach plików lub w osobnym strumieniu (różni się od strumienia wideo). Po ustanowieniu formatu typ nośnika może określać jednostki NAL SPS i PPS w tablicy dwSequenceHeader. Jeśli cbSequenceHeader jest większa niż zero, dwSequenceHeader jest początkiem tablicy bajtów zawierającej jednostki SPS i PPS NALU rozdzielone przez pola o długości 2 bajtów, wszystkie w kolejności bajtów sieciowych (big-endian). Można mieć zarówno usługi SPS, jak i PPS, tylko jeden z tych typów lub żaden. Rzeczywisty typ każdego naLU można określić, sprawdzając pole nal_unit_type samego NALU.

Gdy ten typ nośnika jest używany, każda próbka multimediów rozpoczyna się na początku na początku jednostki NALU, a jednostki NAL nie obejmują przykładów. Dzięki temu dekoder może odzyskać dane z uszkodzenia lub porzuconych próbek.