H.264 視訊類型
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 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_H264、MEDIASUBTYPE_h264、MEDIASUBTYPE_X264或 MEDIASUBTYPE_x264 |
格式類型 | FORMAT_VideoInfo、FORMAT_VideoInfo2、FORMAT_MPEG2Video或 GUID_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:未使用。 設定為零。
- cbSequenceHeader:dwSequenceHeader 的長度,以位元組為單位 陣列。
- 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 單位不會跨越樣本。 這可讓譯碼器從數據損毀或卸除樣本中復原。