共用方式為


影片轉譯器中的來源和目標矩形

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

VIDEOINFOVIDEOINFOHEADER和視訊媒體類型的 VIDEOINFOHEADER2 格式結構中,有三種大小。 本文說明它們是什麼,以及其運作方式。

首先,這些結構的 bmiHeader 成員中有一個大小。 bmiHeader 成員是一個 BITMAPINFOHEADER 結構,其寬度和高度成員 bmiHeader.biWidthbmiHeader.biHeight

其次,rcSource 中有一個矩形, 這些結構的成員:最後,這些結構的 rcTarget 成員中有一個矩形。

假設您有兩個篩選條件 A 和 B,而且這些篩選條件會彼此連線(左邊或上游,右邊為 B,或具有特定視訊媒體類型的下游)。

在篩選 A 和 B 之間傳遞的緩衝區大小 (bmiHeader.biWidthbmiHeader.biHeight)。 篩選 A 應接受由 rcSource 決定的輸入視訊部分,並延展該視訊以填滿緩衝區 rcTarget 部分。 要使用的輸入視訊部分是以 rcSource 與篩選 A 和 B 原本連接之媒體類型之媒體類型的 (biWidthbiHeight) 大小進行比較的方式。 如果 rcSource 是空的,篩選 A 會使用其整個輸入視訊。 如果 rcTarget 是空的,篩選 A 會填滿整個輸出緩衝區。

例如,假設篩選 A 正在接收 160 x 120 像素的視訊數據。 假設篩選 A 連線到具有下列媒體類型的篩選 B。

  • biWidthbiHeight): 320, 240
  • rcSource: (0, 0, 0, 0)
  • rcTarget: (0, 0, 0, 0)

這表示篩選 A 會在 x 和 y 方向中將它接收的視訊延展 2,並填滿 320 x 240 輸出緩衝區。

另一個範例是假設篩選 A 正在接收 160 x 120 視訊數據,且它已連線到具有下列媒體類型的篩選 B。

  • biWidthbiHeight): 320, 240
  • rcSource: (0, 0, 160, 240)
  • rcTarget: (0, 0, 0, 0)

rcSource 成員是相對於連線的緩衝區大小 320, 240。 因為指定的 rcSource (0, 0, 160, 240) 是緩衝區的左半部,篩選 A 會採用其輸入視訊的左半部分,或 (0, 0, 80, 120) 部分,並將視訊延伸至大小 (320, 240) (x 方向為 4,並在 y 方向為 2),並填滿 320 x 240 輸出緩衝區。

現在假設篩選 A 呼叫 CBaseAllocator::GetBuffer,而傳回的媒體範例會附加媒體類型,這表示篩選 B 想要篩選 A 提供不同於先前提供的大小或視訊類型。 假設新的媒體類型為:

  • biWidthbiHeight): 640, 480
  • rcSource: (0, 0, 160, 120)
  • rcTarget: (0, 0, 80, 60)

這表示媒體範例具有大小為 640 x 480 的緩衝區。 rcSource 成員是相對於原始連接的媒體類型 (320, 240), 而不是新的媒體類型 (640, 480),因此 rcSource 指定使用輸入視訊的左上角 (25%)。 輸入視訊的這個部分會放在 640 x 480 輸出緩衝區的左上方 (80, 60) 圖元,如 rcTarget 所指定(0、0、80、60)。 由於篩選 A 正在接收 160 x 120 視訊,因此輸入視訊左上角是一個 (80, 60) 個片段,輸出位圖的大小相同,而且不需要延展。

篩選 A 不會在輸出緩衝區的其他圖元中放置任何數據,而且會將這些位維持不變。 rcSource 成員系結於篩選 A 與 B 之間原始連線媒體類型的 biWidthbiHeight,而 rcTarget 是由媒體範例的新 biWidthbiHeight 系結。 在上述範例中,rcSource 無法超出 (0, 0, 320, 240) 和 rcTarget 無法超出 (0, 0, 640, 480) 的界限。