共用方式為


可延伸 Wave-Format 描述項

下圖顯示波形音訊串流的資料格式描述元。

音訊串流的波形格式描述元圖表。

如圖所示, KSDATAFORMAT 結構之後的其他格式資訊數量會因資料格式而異。

音訊系統以數種方式使用這種類型的格式描述符:

KSDATAFORMAT 結構之後的格式資訊應該是 WAVEFORMATEXTENSIBLE 結構。 WAVEFORMATEXTENSIBLE 是 WAVEFORMATEX 的擴充版本,可以描述比 WAVEFORMATEX 更廣泛的格式。

WAVEFORMAT 已過時,而且任何版本的 Microsoft Windows 中的 WDM 音訊子系統都不支援。 PCMWAVEFORMAT 結構是 WAVEFORMAT 的擴充版本,也已過時。

四個波形格式結構 (WAVEFORMAT、PCMWAVEFORMAT、WAVEFORMATEX 和 WAVEFORMATEXTENSIBLE) 都以相同的五個成員開頭,以 wFormatTag 開頭。 上圖顯示這四個結構彼此疊加,以醒目提示結構中相同的部分。

WAVEFORMATEXTENSIBLE 通過新增三個成員來擴充 WAVEFORMATEX,首先是 Samples.wValidBitsPerSample。 (Samples 是聯集,其另一個成員 wValidSamplesPerBlock 會針對某些壓縮格式使用,而不是 wValidBitsPerSamplewFormatTag 成員緊接在緩衝區中 KSDATAFORMAT 結構結尾之後,會指定 KSDATAFORMAT 之後的格式資訊類型。

與 WAVEFORMATEX 不同,WAVEFORMATEXTENSIBLE 可以執行下列動作:

  1. 將每個樣本的位元數與樣本容器的大小分開指定。 例如,20 位元樣本可以左對齊地儲存在三位元組的容器中。 WAVEFORMATEX 無法區分每個樣本的資料位數與樣本容器大小,因此無法明確描述這類格式。

  2. 將特定說話者位置指派給多聲道串流中的音訊聲道。 WAVEFORMATEX 缺乏此功能,只能充分支援單聲道和(雙聲道)立體聲串流。

WAVEFORMATEX 的遺留使用

WAVEFORMATEX 所描述的任何格式也可以由 WAVEFORMATEXTENSIBLE 描述。 如需將 WAVEFORMATEX 結構轉換成 WAVEFORMATEXTENSIBLE 的相關資訊,請參閱 在格式標籤和子格式 GUID 之間轉換

WAVEFORMATEX 足以描述樣本大小為 8 或 16 位的格式,但 WAVEFORMATEXTENSIBLE 必須充分描述樣本精確度大於 16 位的格式。 以下提供兩個範例:

  • 樣本精確度為 24 位元的資料流程可以使用 32 位元容器大小進行有效率的處理,但可以轉換成使用 24 位元容器,以提高儲存體效率,而不會遺失資料。

  • 處理具有 24 位樣本資料的資料流時,僅提供 20 位精確度的渲染裝置可以使用抖動來改善其輸出訊號的忠實度。 然而,抖動需要額外的處理時間,如果原始流的精度僅為 20 位,則無需進行額外的處理。

在這兩個範例中,只有在樣品精度和容器尺寸都已知的情況下,才能保持訊號品質,同時在處理和儲存效率之間做出適當的權衡。

如果 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構可以明確描述簡單格式,音訊驅動程式可以選擇選取任一結構來描述格式。 不過,音訊驅動程式通常會使用 WAVEFORMATEX 來指定具有 8 位或 16 位樣本的單聲道和 (雙聲道) 立體聲 PCM 格式,而某些較舊的應用程式可能會預期所有音訊驅動程式都使用 WAVEFORMATEX 來指定這些格式。

如果驅動程式支援可明確指定為 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構的音訊格式,則驅動程式應該辨識格式,而不論用戶端應用程式或元件用來指定結構的兩個結構中的哪一個。 例如,如果音訊裝置支援 44.1 kHz、16 位、立體聲 PCM 格式,則迷你埠驅動程式的 KSPROPERTY_PIN_PROPOSEDATAFORMAT 屬性處理常式及其 NewStream 方法實作應該接受該格式,而不論格式是否指定為 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構。

為了簡化格式資料的處理,驅動程式通常會使用 WAVEFORMATEXTENSIBLE 結構來在內部表示格式。 此方法可能需要將輸入 WAVEFORMATEX 結構轉換成內部 WAVEFORMATEXTENSIBLE 表示法,或將內部 WAVEFORMATEXTENSIBLE 表示法轉換成輸出 WAVEFORMATEX 結構。

在 WAVEFORMATEXTENSIBLE 中, dwBitsPerSample 是容器大小,而 wValidBitsPerSample 是每個範例的有效數據位數目。 容器一律在記憶體中以位元組對齊方式,而且容器大小必須指定為 8 位的倍數。