H.264 視訊類型
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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_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 |
Subtype | MEDIASUBTYPE_AVC1 |
格式類型 | FORMAT_MPEG2Video |
格式區塊是 MPEG2VIDEOINFO 結構。 此結構應該填入,如下所示:
- hdr:描述位資料流程的 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 本身的 nal_unit_type 欄位,來判斷每個 NALU 的實際類型。
使用此媒體類型時,每個媒體範例都會從 NALU 的開頭開始,而 NAL 單位不會跨越樣本。 這可讓解碼器從資料損毀或卸載的樣本中復原。