共用方式為


處理數據

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

剖析媒體數據

如果您的篩選器解析媒體數據,請勿信任內容中的標題或其他自我描述性數據。 例如,請勿信任在 AVI RIFF 區塊或 MPEG 封包中顯示的大小值。 這類錯誤的常見範例包括:

  • 讀取 N 個位元組的資料,其中 N 的值來自內容,且未檢查 N 是否與緩衝區的實際大小相符。
  • 跳至緩衝區中的位元組位移,而未確認該位移是否在緩衝區範圍內。

另一個常見的錯誤類別是未能驗證內容中的格式描述。 例如:

  • BITMAPINFOHEADER 結構後面可以接著色彩數據表。 BITMAPINFO 結構定義為 BITMAPINFOHEADER 結構,後面接著一個構成調色板的 RGBQUAD 值的陣列。 陣列的大小由 biClrUsed的值決定。 絕對不要在未先檢查分配給 BITMAPINFO 結構的緩衝區大小的情況下,將色彩數據表複製到 BITMAPINFO
  • WAVEFORMATEX 結構可能會有附加於結構的額外格式資訊。 cbSize 成員會指定額外資訊的大小。

在針腳連結期間,過濾器應確認所有格式結構都結構正確,且包含合理的值。 如果沒有,請拒絕連線。 在驗證格式結構的程式代碼中,請特別小心算術溢位。 例如,在 BITMAPINFOHEADER中,寬度和高度是 32 位元 長整數 值,但影像大小(這是寬度與高度相乘後的結果)只是 DWORD 值。

如果來源的格式數據大於您配置的緩衝區,請勿截斷源數據以將它複製到緩衝區。 這樣做可以建立其隱含大小大於其實際大小的結構。 例如,位圖標頭可能會指定不復存在的調色盤表。 相反地,重新配置緩衝區,或只是讓連線失敗。

串流期間錯誤

當圖形執行時,如果您的篩選收到格式不正確的內容,它應該會終止串流。 執行下列動作:

格式變更

幾個機制可讓篩選器在數據流中途改變格式。 每個步驟都牽涉到一個以上的步驟,這會產生誤判的可能性。 如果您的過濾器收到動態格式變更的要求,您必須要麼拒絕該要求,要麼在新格式到達時接受它。 同樣地,除非其他篩選同意,否則絕對不要切換格式。 如需詳細資訊,請參閱 動態格式變更