共用方式為


H.264 視訊類型

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

下列媒體子類型是針對 H.264 影片所定義的。

Subtype FOURCC Description
MEDIASUBTYPE_AVC1 'AVC1' 不含啟動碼的 H.264 位資料流程。
MEDIASUBTYPE_H264 'H264' H.264 bitstream 與起始碼。
MEDIASUBTYPE_h264 'h264' 相當於 MEDIASUBTYPE_H264,具有不同的 FOURCC。
MEDIASUBTYPE_X264 'X264' 相當於 MEDIASUBTYPE_H264,具有不同的 FOURCC。
MEDIASUBTYPE_x264 'x264' 相當於 MEDIASUBTYPE_H264,具有不同的 FOURCC。

 

這些子類型 GUID 會在 wmcodecdsp.h 中宣告。

這些媒體類型之間的主要差異在於 bitstream 中存在啟動程式碼。 如果子類型 MEDIASUBTYPE_AVC1,則 bitstream 不包含開始程式碼。

H.264 Bitstream with Start Code

透過無線傳輸的 H.264 位資料流程,或包含在 MPEG-2 程式或傳輸串流中,或在 HD-DVD 上錄製,會格式化為如在 HD-T Rec 的附錄 B 中所述。H.264。 根據此規格,bitstream 是由網路抽象層單位序列所組成, (NALUs) ,每個單元的前置詞都等於0x000001或0x00000001。

當 bitstream 中有開始程式碼時,會使用下列媒體類型:

標籤
主要類型 MEDIATYPE_Video
子類型 MEDIASUBTYPE_H264MEDIASUBTYPE_h264MEDIASUBTYPE_X264MEDIASUBTYPE_x264
格式類型 FORMAT_VideoInfoFORMAT_VideoInfo2FORMAT_MPEG2VideoGUID_Null

 

如果格式類型 GUID_Null,則沒有任何格式結構存在。

當 bitstream 包含開始程式碼時,此處所列的任何格式類型就已足夠,因為解碼器不需要任何其他資訊來剖析資料流程。 bitstream 已經包含解碼器所需的所有資訊,而開始程式碼可讓解碼器找出每個 NALU 的開頭。

下列子類型相等:

不含啟動碼的 H.264 Bitstream

MP4 容器格式會儲存 H.264 資料,而不需啟動程式碼。 相反地,每個 NALU 前面都會加上長度欄位,以位元組為單位提供 NALU 的長度。 長度欄位的大小可能會有所不同,但通常是 1、2 或 4 個位元組。

當 bitstream 中沒有開始程式碼時,會使用下列媒體類型。

標籤
主要類型 MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
格式類型 FORMAT_MPEG2Video

 

格式區塊是 MPEG2VIDEOINFO 結構。 此結構應該填入,如下所示:

  • hdr:描述位資料流程的 VIDEOINFOHEADER2 結構。 結構 之 BITMAPINFOHEADER 部分之後沒有色彩表格, 而且 biClrUsed 必須是零。
  • dwStartTimeCode:未使用。 設定為零。
  • cbSequenceHeaderdwSequenceHeader 陣列的長度,以位元組為單位。
  • dwProfile:指定 H.264 設定檔。
  • dwLevel:指定 H.264 層級。
  • dwFlags:用於出現在每個 NALU之前長度欄位的位元組數目。 長度欄位會以位元組表示下列 NALU 的大小。 例如,如果 dwFlags 是 4,則每個 NALU 前面會加上 4 位元組長度欄位。 有效值為 1、2 和 4。
  • dwSequenceHeader:可能包含序列參數集的位元組陣列, (SPS) 和圖片參數集 (PPS) NALUs。

MP4 容器可能包含 SPS) 或圖片參數集 (序列參數集, (PPS) 為檔案標頭中的特殊 NAL 單位,或是與視訊資料流程不同的個別資料流程 () 。 建立格式時,媒體類型可以在 dwSequenceHeader 陣列中指定 SPS 和 PPS NAL 單位。 如果 cbSequenceHeader 大於零, dwSequenceHeader 是位元組陣列的開頭,其中包含 SPS 和 PPS NALUs,並以 2 位元組長度欄位分隔,全都以網路位元組順序 (big-endian) 。 您可以同時擁有 SPS 和 PPS、只有其中一種類型或無。 您可以檢查 NALU 本身的 nal_unit_type 欄位,來判斷每個 NALU 的實際類型。

使用此媒體類型時,每個媒體範例都會從 NALU 的開頭開始,而 NAL 單位不會跨越樣本。 這可讓解碼器從資料損毀或卸載的樣本中復原。