共用方式為


H.264 視訊類型

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

下列媒體子類型是針對 H.264 視訊所定義。

FOURCC 描述
MEDIASUBTYPE_AVC1 'AVC1' 沒有啟動碼的 H.264 位數據流。
MEDIASUBTYPE_H264 'H264' 具有起始碼的 H.264 位數據流。
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

透過空中傳輸的 H.264 位流,或包含在 MPEG-2 程式或傳輸串流中,或在 HD-DVD 上錄製,會格式化為 ITU-T Rec.H.264 的附錄 B 中所述。 根據此規格,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
MEDIASUBTYPE_AVC1
格式類型 FORMAT_MPEG2Video

 

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

  • hdr:描述 bitstream 的 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 的實際類型可藉由檢查 NALU 本身的 nal_unit_type 字段來決定。

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